2014-07-10 169 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)。

相关问题