查找不在列表中的元素
所以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
在item
和z
是迭代器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内存占用,而不是将z
( exclude_sorted_iterator
)存储为列表。