Поиск элементов не в списке
Итак, мой код:
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, когда сравниваются не элементы, но когда я пытаюсь сделать противоположное, используя код выше, ничего не печатает.
Любая помощь?
Ответы
Ответ 1
Ваш код не делает то, что, как вы думаете, он делает. Строка 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)
Ответ 2
>> items = [1,2,3,4]
>> Z = [3,4,5,6]
>> print list(set(items)-set(Z))
[1, 2]
Ответ 3
list1 = [1,2,3,4]; list2 = [0,3,3,6]
print set(list2) - set(list1)
Ответ 4
Использование списка:
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 понимание списка, как указано выше
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]
Ответ 5
Если вы запустите цикл, беря элементы из z, как вы ожидаете, что они не будут в z? ИМХО было бы более разумно сравнивать элементы из другого списка с z.
Ответ 6
>>> 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
Нет, z undefined. 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
Как было сказано в других ответах, вы можете попробовать использовать наборы.
Ответ 8
Ваш код не работает. По определению цикла "item" должен быть в Z. "Цикл" For... in "в Python означает" Loop, хотя список с именем "z", каждый раз, когда вы выполняете цикл, дайте мне следующий элемент в список и назовите его "item" "
http://docs.python.org/tutorial/controlflow.html#for-statements
Я думаю, что ваша путаница возникает из-за того, что вы дважды используете имя переменной "item" , чтобы означать две разные вещи.
Ответ 9
Вы переназначаете элемент значениям в 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
Ответ 10
В случае, когда 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
) в виде списка.