我试图将两个列表合并为一个列表,只包含唯一的元素:
log_file = ['warning CS1607:', 'warning CSS607: cannot', 'normal_string',
'invalid error', 'normal_string', 'invalid error']
warnings_list = ('warning CS', 'warning LNK', 'invalid')
error_list = ('cannot', 'error')
found_warnings = [message for message in log_file for i in warnings_list if i in message]
found_errors = [message for message in log_file for i in error_list if i in message]
found_warnings = list(set(found_warnings))
found_errors = list(set(found_errors))
total_unique_errors = list(set(found_errors + found_warnings))
print total_unique_errors
我得到的输出是正确的:
['invalid error', 'warning CS1607:', 'warning CSS607: cannot']
有没有更好的方法呢?
UPD#1:
另外,如果有任何方法可以节省多少独特的错误或警告,我会感到有兴趣吗?例如,如果我想获得与上述相同的输出,但也希望能够检查总错误/警告编号:len(found_errors)
。
谢谢!
答案 0 :(得分:2)
首先将log_file
条目转换为集合,以删除重复的条目,例如
log_file = set(log_file)
将错误和警告列表合并到一个元组
entries = errors_list + warnings_list
然后迭代要检查的项目,如此
[item for item in log_file if any(entry in item for entry in entries)]
简而言之,您的代码可以像这样编写
>>> entries = error_list + warnings_list
>>> [item for item in set(log_file) if any(entry in item for entry in entries)]
['invalid error', 'warning CS1607:', 'warning CSS607: cannot']
修改:根据更新的问题,
>>> log_file = set(log_file)
>>> warnings = [item for item in log_file if any(entry in item for entry in warnings_list)]
>>> errors = [item for item in log_file if any(entry in item for entry in error_list)]
>>> warnings
['invalid error', 'warning CS1607:', 'warning CSS607: cannot']
>>> errors
['invalid error', 'warning CSS607: cannot']
>>> list(set(warnings + errors))
['invalid error', 'warning CS1607:', 'warning CSS607: cannot']
如果您可以使用sets
,则无需转换为list
并使用set
理解,就像这样
>>> warnings = {item for item in log_file if any(entry in item for entry in warnings_list)}
>>> errors = {item for item in log_file if any(entry in item for entry in error_list)}
>>> warnings
set(['invalid error', 'warning CS1607:', 'warning CSS607: cannot'])
>>> errors
set(['invalid error', 'warning CSS607: cannot'])
>>> warnings | errors
set(['invalid error', 'warning CS1607:', 'warning CSS607: cannot'])