在Python中返回不在第二个列表中的列表元素的更有效方法是什么?

时间:2010-06-09 05:57:57

标签: python

在python中有更快的方法吗?

[f for f in list_1 if not f in list_2]

list_1和list_2都包含大约120,000个字符串。生成新列表大约需要4分钟。

2 个答案:

答案 0 :(得分:9)

如果您将list_2放入set,则应该更快地检查遏制措施:

s = set(list_2)
[f for f in list_1 if not f in s]

这是因为x in list是O(n)检查,而x in set是常数时间。

另一种方法是使用set-difference:

list(set(list_1).difference(set(list_2)))

但是,这可能不会比第一种方式更快 - 而且,它将消除您可能不想要的list_1重复项。

答案 1 :(得分:4)

根据您对新列表的处理方式,如果您使用itertools.ifilter()进行某种延迟评估可能就足够了(因此您不需要花时间,事先建立新列表,但是在任何情况下都应该将list_2转换为set,因此查找为O(1)):

import itertools:
set_2 = set(list_2)

for f in itertools.ifilter(lambda x: x not in set_2, list_1):
    # do something with f