在python中有更快的方法吗?
[f for f in list_1 if not f in list_2]
list_1和list_2都包含大约120,000个字符串。生成新列表大约需要4分钟。
答案 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