如何在Python中检查List A中的元素是否不存在于List B中?

12

如果我只有一个元素,这很容易:

>>> 3 not in [2, 3, 4]
False
>>> 3 not in [4, 5, 6]
True

但是如果我有两个列表并且需要检查列表A中的元素是否出现在列表B中怎么办?

A=[1,2,3,4]
B=[4,5,6,7]

我该如何获得一个结果,显示123不在列表B中?


可能是查找不在列表中的元素的重复问题。 - Eli Korvigo
6个回答

7

如果列表中的项是可哈希的:

>>> set(A) - set(B)
{1, 2, 3}

否则,您可以使用filter函数:filter
>>> list(filter(lambda a: a not in B, A))
[1, 2, 3]

在这种情况下,如果B已经排序,您可以通过使用bisect.bisect_left进行对数搜索来获得更好的性能:
>>> def pred(a):  # if B is already *sorted*
...     from bisect import bisect_left
...     i = bisect_left(B, a)
...     return i == len(B) or B[i] != a
... 
>>> list(filter(pred, A))
[1, 2, 3]

6
你也可以使用列表推导式:
```python ```
C=[i for i in A if i not in B]

输出:

[1, 2, 3]

3

使用列表推导:

真值答案

any([True for x in [1, 2, 3, 4] if x in [4, 5, 6, 7]])

第二个列表中不存在的元素列表

[x for x in [1, 2, 3, 4] if x not in [4, 5, 6, 7]]

请解释您的答案,以便提问者能够理解其工作原理。 - SuperBiasedMan
元素重复怎么办? - itsvinayak

2
set(A).difference(B) # set operation for difference between two collections A and B

只是要指出这不是对称差。当列表不完全相等时,“set(A).difference(B)”将产生与“set(B).difference(A)”不同的结果。如果B包含A的一个子集,则后者将产生一个空集。“set(A).symmetric_difference(B)”产生的结果与“set(B).symmetric_difference(A)”相同。这是一个好链接: https://www.programiz.com/python-programming/methods/set/difference - Daniel F

1
这是关于集合布尔运算的典型案例:
zerotonine = set(range(10))
fourtoten = set(range(4,11))
print "exclusively in one:", zerotonine ^ fourtoten
exclusively in one: set([0, 1, 2, 3, 10])

1
仅仅是为了指出:这与使用set(A).symmetric_difference(B)相同,其结果与set(B).symmetric_difference(A)相同。请注意,set(A).difference(B)可能会返回与set(B).difference(A)不同的结果(“在A中但不在B中”与“在B中但不在A中”),如果您正在寻找这样的属性(正如问题的标题所暗示的那样)。 - Daniel F

0

你可以使用 set

例如:

>>> a=[1,2,3,4]
>>> b=[4,5,6,7]
>>> list(set(a)-set(b))
[1, 2, 3]
>>>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接