2010-01-20 9 views
39

Así que aquí mi código:elementos hallazgo no en una lista

item = [0,1,2,3,4,5,6,7,8,9] 

for item in z: 
    if item not in z: 
     print item 

Z contiene una lista de números enteros. Quiero comparar el artículo a Z e imprimir los números que no están en Z en comparación con el artículo. Puedo imprimir los elementos que están en Z cuando los comparo no elementos, pero cuando intento hacer lo contrario usando el código anterior, nada se imprime.

¿Algún ayuda?

Respuesta

90

Tu código no está haciendo lo que creo que crees que está haciendo. La línea for item in z: repetirá a través de z, haciendo cada vez item igual a un solo elemento de z. La lista original item se sobrescribe antes de que haya hecho algo con ella.

Creo que quieres algo como esto:

item = [0,1,2,3,4,5,6,7,8,9] 

for element in item: 
    if element not in z: 
     print element 

Pero aquí se puede hacer esto como:

set(item) - set(z) 
+58

Una manera más Pythonic de escribir ese primer bit sería '[x para x en el elemento si x no en z] ' –

+3

usando' set' no funcionaría correctamente si la lista marcada contiene elementos no únicos, ya que 'set' eliminaría primero todas las ocurrencias, salvo una, del elemento no único de la lista. – VDV

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

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

Esto no funciona ... Tienes que hacer 'print list (set (list2) - 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

Si ejecuta un bucle de tomar elementos de Z, ¿cómo esperar que ellos no estén en z? En mi humilde opinión, tendría más sentido comparar elementos de una lista diferente a z.

2

n, z es indefinido. el elemento contiene una lista de enteros.

Creo que lo que estamos tratando de hacer es lo siguiente:

#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 

Como se ha dicho en otras respuestas, es posible que desee probar el uso de conjuntos.

2

Su código es una operación no operativa. Según la definición del ciclo, "elemento" tiene que estar en Z. Un ciclo "For ... in" en Python significa "Loop a través de la lista llamada 'z', cada vez que bucle, me da el siguiente elemento en el lista, y lo llaman 'elemento'"

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

Creo que surge de su confusión por el hecho de que está utilizando el nombre de la variable 'elemento' dos veces, para significar dos cosas diferentes.

0

Está reasignando el elemento a los valores en z a medida que recorre z. Por lo tanto, la primera vez en su bucle for, item = 0, next item = 1, etc ... Nunca revisa una lista frente a la otra.

para hacerlo de manera muy explícita:

>>> 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

Utilizando lista por comprensión:

print [x for x in item if x not in Z] 

o el uso de la función de filtro:

filter(lambda x: x not in Z, item) 

Usando set en cualquier forma puede generar un error si la lista que se verifica contiene elementos no únicos, por ejemplo:

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} 

versus lista de comprensión que el anterior

print [x for x in item if x not in Z] 

Out[38]: [0, 1, 1, 2, 7, 8, 9] 

o función de filtro:

filter(lambda x: x not in Z, item) 

Out[38]: [0, 1, 1, 2, 7, 8, 9] 
0

En el caso en que item y z son iteradores ordenados, podemos reducir la complejidad de O(n^2) a O(n+m) haciendo esto

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 

Si los dos son iteradores, también tenemos la oportunidad de reducir la huella de memoria que no almacena z (exclude_sorted_iterator) como una lista.

+0

para bucle (que es respuesta aprobada) grande Oh es 'O (n)' y su respuesta ha anidado el bucle un rato en bucle para que la complejidad aumente en su caso que es 'O (n^2)' –

Cuestiones relacionadas