两个列表中的唯一项目列表,彼此之间具有重复项

时间:2015-02-28 12:18:43

标签: python list python-2.7

我试图将两个列表合并为一个列表,只包含唯一的元素:

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)

谢谢!

1 个答案:

答案 0 :(得分:2)

  1. 首先将log_file条目转换为集合,以删除重复的条目,例如

    log_file = set(log_file)
    
  2. 将错误和警告列表合并到一个元组

    entries = errors_list + warnings_list
    
  3. 然后迭代要检查的项目,如此

    [item for item in log_file if any(entry in item for entry in entries)]
    
  4. 简而言之,您的代码可以像这样编写

    >>> 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'])
    
相关问题