【发布时间】:2017-11-25 00:36:18
【问题描述】:
所以我对列表理解和 map/filter/reduce 的概念相当陌生,但觉得这可以用几行和更少的标识来完成:
ip_tlsv1_counts = {}
for filename in os.listdir(directory_path):
if filename.endswith(LOG_FILE_EXTENSION):
with open(os.path.join(directory_path, filename)) as file_handle:
for line_contents in file_handle:
line_groups = re.search(LOG_LINE_REGEX, line_contents)
if line_groups and line_groups.group(8) == "TLSv1":
if not line_groups.group(2) in ip_tlsv1_counts:
ip_tlsv1_counts[line_groups.group(2)] = 1
else:
ip_tlsv1_counts[line_groups.group(2)] += 1
return ip_tlsv1_counts
【问题讨论】:
-
那么,它有什么作用?
-
您将通过使用几个函数来减少缩进并提高清晰度。我怀疑理解将是你的救命之恩。
-
您可以使用
Counter而不是dict来代替ip_tlsv1_counts,并将您的内部if-else替换为简单的ip_tlsv1_counts[line_groups.group(2)] += 1 -
您可以通过迭代
log_files = (f for f in os.listdir(directory_path) if f.endswith(LOG_FILE_EXTENSION)轻松删除缩进块,然后对其进行迭代:for file in log_files: -
@Coldspeed 这使用一个正则表达式来匹配文件中的日志条目并计算具有“TLSv1”字段的 IP 地址的出现次数
标签: python dictionary filter list-comprehension reduce