查找不在列表中的元素

时间:2010-01-20 19:35:13

标签: python list

所以继承我的代码:

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进行比较,并打印出与z相比时不在item中的数字。

我可以打印z中的元素而不是item,但是当我尝试使用上面的代码执行相反操作时,没有任何内容打印。

任何帮助?

10 个答案:

答案 0 :(得分:129)

您的代码没有按我认为的那样做。行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)

答案 1 :(得分:49)

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

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

答案 2 :(得分:11)

使用列表理解:

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}

vs list comprehension如上所述

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]

答案 3 :(得分:9)

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

print set(list2) - set(list1)

答案 4 :(得分:3)

如果你从z运行一个循环的项目,你怎么期望它们不在z?恕我直言,将不同列表中的项目与z进行比较会更有意义。

答案 5 :(得分:3)

不,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

正如其他答案中所述,您可能想尝试使用集合。

答案 6 :(得分:2)

>>> 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])

答案 7 :(得分:2)

您的代码是无操作的。通过循环的定义,“item”必须在Z中。在Python中的“For ... in”循环意味着“循环通过名为'z'的列表,每次循环时,给我下一个项目列表,并将其命名为“item”“

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

我认为您的混淆源于您使用变量名称“item”两次,意味着两种不同的事情。

答案 8 :(得分:0)

在迭代z时,您将项重新分配给z中的值。所以第一次在你的for循环中,item = 0,next 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

答案 9 :(得分:0)

如果itemz是排序迭代器,我们可以通过执行此操作将复杂度从O(n^2)降低到O(n+m)

def iexclude(sorted_iterator, exclude_sorted_iterator):
    next_val = next(exclude_sorted_iterator)
    for item in sorted_iterator:
        try:
            while next_val < item:
                next_val = next(exclude_sorted_iterator)
                continue
            if item == next_val:
                continue
        except StopIteration:
            pass
        yield item

如果这两个是迭代器,我们还有机会减少不将zexclude_sorted_iterator)存储为列表的内存占用。