Skip to content

Instantly share code, notes, and snippets.

@victorusachev
Created May 25, 2019 20:14
Show Gist options
  • Select an option

  • Save victorusachev/824f14365d7005c899b7c25e3316046c to your computer and use it in GitHub Desktop.

Select an option

Save victorusachev/824f14365d7005c899b7c25e3316046c to your computer and use it in GitHub Desktop.
class Predicate:
def __init__(self, pattern):
self.pattern = pattern
def __call__(self, value):
return self.pattern in value
def __repr__(self):
return f'<Predicate: {self.pattern}>'
def read(path):
with open(path, 'r') as fp:
for line in fp.readlines():
yield line.replace('.', '')
def method_1(lines, patterns, func):
patterns = tuple(patterns) # на случай, если это генератор
for line in lines:
for pattern in patterns:
if func(line, pattern):
yield line, pattern
def method_2(lines, predicates):
predicates = tuple(predicates) # на случай, если это генератор
for line in lines:
yield from map(
lambda p: (line, p),
filter(lambda p: p(line), predicates)
)
def main(path_to_data, path_to_patterns):
# 1
results = method_1(
lines=read(path_to_data),
patterns=read(path_to_patterns),
func=lambda l, p: p in l
)
print(list(results))
# 2
patterns = read(path_to_patterns)
predicates = (Predicate(p) for p in patterns)
results = method_2(
lines=read(path_to_data),
predicates=predicates
)
print(list(results))
if __name__ == '__main__':
data_path = 'input.txt'
patterns_path = 'patterns.txt'
main(data_path, patterns_path)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment