2015-11-13 50 views
1

我正在使用python嘗試並從另一個列表中刪除相交的項目。所以下面是我的。Python從另一個列表中存在的列表中刪除項目,但保留不在該交集中的重複項

letter = ['a', 'a', 'i', 'd', 'e', 'i', 'a', 'b', 'b', 'c', 'o', 'g', 'a', 'f', 'f', 'i', 'g', 'i' ] 
cons = ['b','c','d', 'f', 'g'] 

什麼,我要的是信從列表中刪除的利弊列表中的任何字母,但保留一切。所以下面是我想要得到的。

letter = ['a', 'a', 'i', 'e', 'i', 'a', 'o', 'a', i', 'i' ] 

以下是我迄今爲止所嘗試的,但它不工作。

for i in letter[:]: 
    if i in cons: 
     letter.remove(i) 
     cons.remove(i) 

和...

list(set(x) - set(y)) 

我只是想刪除列表的交集,並保留重複項不在第二列表中的第一個列表。到目前爲止,我嘗試過的所有內容都刪除了我想保留的第一個列表中的重複項。任何幫助是極大的讚賞!

回答

7
>>> letter = ['a', 'a', 'i', 'd', 'e', 'i', 'a', 'b', 'b', 'c', 'o', 'g', 'a', 'f', 'f', 'i', 'g', 'i' ] 
>>> cons = ['b','c','d', 'f', 'g'] 

>>> [x for x in letter if x not in cons] 
['a', 'a', 'i', 'e', 'i', 'a', 'o', 'a', 'i', 'i'] 

一個簡單的列表理解會做的伎倆?

編輯:

正如ShadowRanger說,這將提高(主要針對大型數據集不止這些),以利弊轉換爲一組性能:

cons = set(cons) 

然後進入名單補償。這是更好,因爲sets被散列,並使得獲取項目/檢查它的項目的方式更快

+1

而對於效率,這可能有助於將'cons'存儲爲'set' /'frozenset'(或者如果它很短,就像一個簡單的'str',它仍然是線性掃描時間,但是對於單個字符的會員測試比單獨的字符更快,列表中的單個字符串)。 – ShadowRanger

+0

的確如此,我並不十分擔心這方面的效率,但這會大大提升。編輯添加 –

2

列表理解比較好,但是你原來的代碼的工作,如果我們只是刪除一行:

>>> letter = ['a', 'a', 'i', 'd', 'e', 'i', 'a', 'b', 'b', 'c', 'o', 'g', 'a', 'f', 'f', 'i', 'g', 'i' ] 
>>> cons = ['b','c','d', 'f', 'g'] 
>>> for i in letter[:]: 
...  if i in cons: 
...   letter.remove(i) 
... 
>>> letter 
['a', 'a', 'i', 'e', 'i', 'a', 'o', 'a', 'i', 'i'] 
相關問題