查找不在列表中的元素

所以inheritance我的代码:

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

Z包含一个整数列表。 我想将项目与Z进行比较,并打印出与项目相比不在Z中的数字。 我可以打印在Z比较不是项目的元素,但是当我试着做相反的使用上面的代码没有打印。

任何帮助?

你的代码不是在做你认为它正在做的事情。 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 

但是你可以很容易地做到这一点:

 set(item) - set(z) 
 >> items = [1,2,3,4] >> Z = [3,4,5,6] >> print list(set(items)-set(Z)) [1, 2] 
 list1 = [1,2,3,4]; list2 = [0,3,3,6] print set(list2) - set(list1) 

使用列表理解:

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

或使用过滤function:

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

如果被检查的列表包含非唯一的元素,以任何forms使用set可能会产生一个bug,例如:

 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上面的列表理解

 print [x for x in item if x not in Z] Out[38]: [0, 1, 1, 2, 7, 8, 9] 

或过滤function:

 filter(lambda x: x not in Z, item) Out[38]: [0, 1, 1, 2, 7, 8, 9] 

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

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

不,z是不确定的。 项目包含一个整数列表。

我认为你想要做的是这样的:

 #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 

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

你的代码是没有操作的。 通过循环的定义,“item”必须在Z中。Python中的“For … in”循环意味着“循环列表中的所谓'z',每次循环时,给我下一个项名单,并称之为'项目'“

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

我认为你的困惑是因为你使用variables名“item”两次,意味着两件不同的事情。

当您在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 

itemz是迭代器sorting的情况下,我们可以通过这样做将复杂度从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 

如果两者都是迭代器,我们也有机会减less内存占用,而不是将zexclude_sorted_iterator )存储为列表。