2012-06-14 52 views
3

我希望我不在這裏複製:-)Python:過濾列表的最有效方法

我想知道什麼是過濾python列表最有效的方式。 我手中的任務是找出列表中沒有出現在其他列表中的元素。

我的拳頭列表對象的列表(沒有不必要的細節):

Class A: 
    def __init__(self,item1, item2): 
     self.item1 = item1 
     self.item2 = item2 

後來,在我的劇本我解析一個輸入文本文件,並用實際數據填充一個list1(包括item1item2字段是字符串)

還有第二個列表list2,其中只包含一個字符串列表,其中包括item1。我感興趣的是list1中的元素,其中item1不在list2中。
list1包含約3000元,list2較大 - 大約60000元。)

我的拳頭嘗試是相當明顯的:

notMatched = list(itertools.ifilter(lambda x: x.item1 not in list2), list1)) 

現在,它將按預期工作,給我什麼我想,但我仍然想知道這是否是我可以帶來的最佳解決方案。 任何想法的人?

謝謝

+0

您的解決方案將受益於list2'轉換'到'set',但你可能會發現,在達人的答案列表理解是更快(更容易閱讀) –

回答

5

使list2成爲一組。這將提高查找性能not in list2

你或許可以不用它:

set2 = set(list2) 
not_matched = [a for a in list1 if not a.item1 in set2] 
+0

當獲得'not_matched'時,將兩個列表轉換爲'set'是否可以?例如'not_matched = set(list1)^ set(list2)'..這裏是否存在性能問題? – msvalkon

+1

這是行不通的,因爲'list1'和'list2'是不同的類型。我不確定你是否可以通過編寫一個'A .__ cmp__'來解決這個問題。另外,假設你想保留它,你就會失去訂單。至於性能問題:從序列*創建一個'set'具有*至少爲O(n)。相交兩個'set's可能至少是O(n),所以,不,這不會更快。除非你已經準備好了... –

+0

感謝您的澄清。 – msvalkon

相關問題