Python:过滤列表的最有效方法

3

希望我这里没有重复 :-)

我想知道过滤Python列表的最有效方法。 我手头的任务是找出未出现在另一个列表中的列表元素。

我的第一个列表是一个对象列表(没有不必要的细节):

Class A:
    def __init__(self,item1, item2):
        self.item1 = item1
        self.item2 = item2

稍后,在我的脚本中,我正在解析一个输入文本文件,并使用真实数据填充list1item1item2字段都是字符串)。
还有第二个列表list2,其中只包含与item1相对应的字符串列表。我感兴趣的是,在list2中不存在item1list1元素。
list1包含大约3000个元素,list2更大-约60000个元素。) 我的第一次尝试非常明显:
notMatched = list(itertools.ifilter(lambda x: x.item1 not in list2), list1))

现在,它按预期工作,为我提供了我想要的内容,但我仍然在想这是否是我能想到的最佳解决方案。有任何想法吗?

谢谢


你的解决方案可以将list2转换为set,但你可能会发现Daren的答案中的列表推导式更快(且更易于阅读)。 - John La Rooy
1个回答

5

list2转换成集合。这将提高查找not in list2的性能。

你可能会用以下代码来实现:

set2 = set(list2)
not_matched = [a for a in list1 if not a.item1 in set2]

把两个列表都转换成集合(set)来获取未匹配项(not_matched),这样做可以吗?比如 not_matched = set(list1) ^ set(list2) .. 这样做会不会有性能问题? - msvalkon
1
这样做不行,因为list1list2是不同类型的。我不确定你是否可以通过编写A.__cmp__来解决这个问题。此外,您会失去排序 - 假设您想保留它。至于性能问题:从序列创建一个set至少需要O(n)。交集两个set也可能至少需要O(n),所以,不,那永远不会更快。除非你已经有了这些集合... - Daren Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接