2014-07-10 128 views
1

我有一個主列表A和輔助列表BA包含B的所有元素,並且還包含其他元素。我想確定A的值不會發生在B。例如:查找列表中的任何元素是否在另一個列表中

A = ['two', 'roads', 'diverged', 'in', 'a'] 
B = ['roads', 'in'] 

我要的是:

['two', 'diverged', 'a'] 

如果B只包含一個元素,說roads,我能做些什麼來的效果:

for i in range(0, len(A)): 
    if 'roads' not in A[i]: 
     print A[i] 

但我如果B有多個元素,它就會卡住。我發現any()功能,但我不知道爲什麼,這是行不通的:

for i in range(0, len(A)): 
    if any(B) not in A[i]: 
     print A[i] 

(我看了一些其他的答案,也沒有找到什麼,我找這可能被要求在其他地方。如果是這樣,請原諒我問了兩遍。)

+0

請不要在標題中標記您的問題。 –

回答

5
[item for item in a if item not in b] 

你也可以通過做set(a) - set(b)使用集,但我相信這將是稍微慢一點。此外,使用集還會刪除結果中的重複值,這可能是也可能不是你想要的。

+1

'set'也不能保存順序。看起來像OP想要保持秩序。 – karthikr

+2

如果b很大,可以考慮使b成爲一組。 – timgeb

+1

你爲什麼期望集合差異會變慢?輸入長度爲A和B時,設定的差值應以O(A + B)而不是O(AB)運行。它可能有一個更糟糕的常數因素(我沒有嘗試過),但並不是絕對如此。 – user2357112

4

嘗試列表理解:

[x for x in A if x not in B] 
1

雖然接受的答案肯定是最好的多種用途其算法複雜度爲O(N×M),其中N和M是AB長度。在大多數情況下(即當AB不會太長時間),這並不重要。 但是,如果打算通過第一轉換Bfrozen set處理非常長的列表,你會提高處理時間:

tmp = frozenset(B) 
[i for i in A if i not in tmp] 

所得複雜度爲O(N + M)。

相關問題