Поиск элементов не в списке - PullRequest
56 голосов
/ 20 января 2010

Вот мой код:

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, но когда я пытаюсь сделать обратное, используя приведенный выше код, ничего не печатается.

Любая помощь?

Ответы [ 10 ]

132 голосов
/ 20 января 2010

Ваш код не делает то, что я думаю, вы думаете, что делает. Строка 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)
49 голосов
/ 20 января 2010
>> items = [1,2,3,4]
>> Z = [3,4,5,6]

>> print list(set(items)-set(Z))
[1, 2]
11 голосов
/ 08 июня 2016

Использование списка понимания:

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}

против понимания списка, как указано выше

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]
9 голосов
/ 20 января 2010
list1 = [1,2,3,4]; list2 = [0,3,3,6]

print set(list2) - set(list1)
3 голосов
/ 20 января 2010

Нет, 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

Как было сказано в других ответах, вы можете попробовать использовать наборы.

3 голосов
/ 20 января 2010

Если вы запускаете цикл, берущий элементы из z, как вы ожидаете, что их не будет в z? ИМХО было бы логичнее сравнивать элементы из другого списка с z.

2 голосов
/ 20 января 2010

Ваш код не предназначен. По определению цикла, «элемент» должен быть в Z. Цикл «For ... in» в Python означает «цикл, хотя список с именем« z », каждый раз, когда вы делаете цикл, дает мне следующий элемент список, и назовите его "пункт" "

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

Я думаю, что ваша путаница возникает из-за того, что вы дважды используете имя переменной "item", что означает две разные вещи.

2 голосов
/ 20 января 2010
>>> 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])
0 голосов
/ 10 марта 2017

В случае, когда 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) в виде списка.

0 голосов
/ 20 января 2010

Вы переназначаете элемент на значения в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...