在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