2010-01-20 2 views
39

Так Heres мой код:Нахождение элементов нет в списке

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

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

ответ

90

Ваш код не делает то, что я думаю, вы думаете, что оно делает. Линия 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) 
+58

Более питоновский способ записи этого первого бита будет '[x for x в элементе if x not в z] ' –

+3

, используя' set', не будет работать корректно, если указанный список содержит неповторимые элементы, так как 'set' сначала удаляет из списка все, кроме одного, вхождения неповторяющегося элемента. – VDV

9
list1 = [1,2,3,4]; list2 = [0,3,3,6] 

print set(list2) - set(list1) 
+0

Это не работает. Вам нужно сделать 'print list (set2) - set (list1))' – Whitecat

43
>> items = [1,2,3,4] 
>> Z = [3,4,5,6] 

>> print list(set(items)-set(Z)) 
[1, 2] 
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]) 
3

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

2

Нет, г не определено. 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 

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

2

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

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

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

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

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

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] 
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) в виде списка.

+0

для цикла (который является одобренным ответом) большой Oh - это «O (n)», и ваш ответ имеет вложенный цикл while в цикл for, так что сложность будет увеличиваться в вашем случае, что является «O (n^2)», –

Смежные вопросы