2010-06-09 26 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

相關問題