在列表中查找不包含的元素

95

这是我的代码:

item = [0,1,2,3,4,5,6,7,8,9]
z = []  # list of integers

for item in z:
    if item not in z:
        print item

z 包含一组整数。我想将 itemz 进行比较,并打印出与 item 不同的数字。

我可以打印出在比较时属于z而不是item的元素,但是使用上面的代码尝试相反的操作时没有任何输出。

有什么帮助吗?


这回答您的问题吗?获取两个列表之间的差异 - Georgy
12个回答

216
你的代码并没有实现你所期望的功能。代码中的这行:for item in z:将会遍历整个z列表,每次将item设置为z中的一个元素。因此,在你对它进行任何操作之前,原始的item列表就已被覆盖掉了。
我认为你想要的是这样的代码:
item = [0,1,2,3,4,5,6,7,8,9]

for element in item:
    if element not in z:
        print(element)

但你可以轻松地像这样做:

[x for x in item if x not in z]

或者(如果您不介意失去非唯一元素的重复项):

set(item) - set(z)

5
如果要检查的列表包含非唯一元素,则使用 set 将无法正确工作,因为 set 首先会从列表中删除除一个外的所有重复元素。 - VDV

73
>> items = [1,2,3,4]
>> Z = [3,4,5,6]

>> print list(set(items)-set(Z))
[1, 2]

23
使用列表推导式:
print [x for x in item if x not in Z]

或者使用过滤函数:

filter(lambda x: x not in Z, item)

如果要检查的列表中包含非唯一元素,则以任何形式使用set都可能会导致错误,例如:

print item

Out[39]: [0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9]

print Z

Out[40]: [3, 4, 5, 6]

set(item) - set(Z)

Out[41]: {0, 1, 2, 7, 8, 9}

与上面的列表推导式相比

print [x for x in item if x not in Z]

Out[38]: [0, 1, 1, 2, 7, 8, 9]

或者筛选函数:

filter(lambda x: x not in Z, item)

Out[38]: [0, 1, 1, 2, 7, 8, 9]

13
list1 = [1,2,3,4]; list2 = [0,3,3,6]

print set(list2) - set(list1)

4
>>> item = set([0,1,2,3,4,5,6,7,8,9])
>>> z = set([2,3,4])
>>> print item - z
set([0, 1, 5, 6, 7, 8, 9])

4
不,z未定义。item包含一个整数列表。
我认为你想做的是这样的:
#z defined elsewhere
item = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

for i in item:
  if i not in z: print i

正如其他答案所述,您可能希望尝试使用集合(set)。


4
如果您运行一个从z中获取项目的循环,您怎么能期望它们不在z中呢?我个人认为将来自不同列表的项目与z进行比较会更有意义。

3
你的代码是无操作的。根据循环的定义,“item”必须在Z中。Python中的“for ... in”循环意味着“循环遍历名为'z'的列表,每次循环时,给我列表中的下一个项目,并将其称为'item'”。

http://docs.python.org/tutorial/controlflow.html#for-statements

我认为你的困惑源于使用了变量名“item”两次,分别表示两个不同的含义。

2
许多已发布的解决方案将不会保留元素的原始顺序(因为集合是无序的),或者效率低下(因为列表中的线性搜索比集合中的查找更慢)。您可以预先创建一个要删除的元素集,并使用列表推导式仅保留不在该集合中的元素。
items = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
z = [3, 4, 5, 6]

set_z = set(z)
result = [e for e in items if e not in set_z]

然后,result 包含:
[0, 1, 2, 7, 8, 9]

1

你正在通过迭代 z 来重新分配 item 的值。因此,在 for 循环中第一次,item = 0,下一个 item = 1,以此类推... 你从未将一个列表与另一个列表进行比较。

为了非常明确地做到这一点:

>>> item = [0,1,2,3,4,5,6,7,8,9]
>>> z = [0,1,2,3,4,5,6,7]
>>> 
>>> for elem in item:
...   if elem not in z:
...     print elem
... 
8
9

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