所以继承我的代码:
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
包含整数列表。我想将item
与z
进行比较,并打印出与z
相比时不在item
中的数字。
我可以打印z
中的元素而不是item
,但是当我尝试使用上面的代码执行相反操作时,没有任何内容打印。
任何帮助?
答案 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)
如果item
和z
是排序迭代器,我们可以通过执行此操作将复杂度从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
如果这两个是迭代器,我们还有机会减少不将z
(exclude_sorted_iterator
)存储为列表的内存占用。