在python中有更快的方法吗?在Python中返回不在第二个列表中的列表元素的更有效的方法是什么?
[f for f in list_1 if not f in list_2]
list_1和list_2都由大约120.000个字符串组成。大约需要4分钟来生成新的列表。
在python中有更快的方法吗?在Python中返回不在第二个列表中的列表元素的更有效的方法是什么?
[f for f in list_1 if not f in list_2]
list_1和list_2都由大约120.000个字符串组成。大约需要4分钟来生成新的列表。
如果你把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
是恒定时间。
另一种方法是使用设置的区别:
list(set(list_1).difference(set(list_2)))
然而,这可能不会比第一种方式快 - 还,它会从list_1
,你可能不希望消除重复。
根据你想要用新列表做什么,如果你用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
这个效果很好,从233.66秒减少到0.09秒! – Hobhouse 2010-06-09 06:37:32
你应该**,而不是在列表理解变换'list_2'到'set' **提前。否则,你每次都将它转换成一个集合,这并不是真的加快速度;) – 2010-06-09 06:18:54
@Felix - 哦,当然!谢谢,更新。 – tzaman 2010-06-09 06:28:57
将list_2从233.66秒改为0.07秒的改进列表生成时间!但正如Felix Kling所说:我必须事先转换成一套。列表(set(list_1).difference(set(list_2))) 花了0.12秒,也适合我的使用。 – Hobhouse 2010-06-09 06:35:30