2010-06-09 27 views

回答

9

如果你把list_2set,就应该使遏制检查快了很多:

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

这是因为x in list复杂度为O(n)的检查,而x in set是恒定时间。

另一种方法是使用设置的区别:

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

然而,这可能不会比第一种方式快 - 还,它会从list_1,你可能不希望消除重复。

+1

你应该**,而不是在列表理解变换'list_2'到'set' **提前。否则,你每次都将它转换成一个集合,这并不是真的加快速度;) – 2010-06-09 06:18:54

+0

@Felix - 哦,当然!谢谢,更新。 – tzaman 2010-06-09 06:28:57

+0

将list_2从233.66秒改为0.07秒的改进列表生成时间!但正如Felix Kling所说:我必须事先转换成一套。列表(set(list_1).difference(set(list_2))) 花了0.12秒,也适合我的使用。 – Hobhouse 2010-06-09 06:35:30

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 
+0

这个效果很好,从233.66秒减少到0.09秒! – Hobhouse 2010-06-09 06:37:32

相关问题