2010-01-20 14 views
39

Così heres il mio codice:constatazione non elementi di 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 un elenco di numeri interi. Voglio confrontare l'articolo con Z e stampare i numeri che non sono in Z rispetto all'elemento. Posso stampare gli elemtens che sono in Z se paragonati non agli articoli, ma quando provo a fare il contrario usando il codice sopra le stampe di niente.

Qualsiasi aiuto?

risposta

90

Il tuo codice non sta facendo quello che penso tu pensi che stia facendo. La riga for item in z: itererà attraverso z, ogni volta rendendo item uguale a un singolo elemento di z. L'elenco originale item viene quindi sovrascritto prima che tu abbia fatto qualcosa con esso.

Penso che si desidera qualcosa di simile:

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

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

ma si potrebbe facilmente fare questo come:

set(item) - set(z) 
+58

Un altro modo di scrivere Pythonic che il primo bit sarebbe '[x per x nell'elemento se x non in z] ' –

+3

utilizzando' set' non funzionerebbe correttamente se l'elenco controllato contiene elementi non univoci, poiché 'set' rimuoverà prima tutti gli eventi tranne uno dall'elemento non univoco dall'elenco. – VDV

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

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

Questo non funziona .. È necessario fare '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

Se si esegue un ciclo di prendere elementi da z, come si aspetta loro di non essere in z? IMHO sarebbe più sensato confrontare gli elementi da un elenco diverso a z.

2

No, z è definito. l'oggetto contiene un elenco di numeri interi.

Penso che quello che stai cercando di fare è questo:

#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 

Come è stato detto in altre risposte, si consiglia di provare a utilizzare set.

2

Il codice è un no-op. Con la definizione del loop, "item" deve essere in Z. Un ciclo "For ... in" in Python significa "Loop se la lista chiama 'z', ogni volta che fai un loop, dammi il prossimo elemento nel lista, e lo chiamano 'voce'"

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

credo che la vostra confusione nasce dal fatto che si sta utilizzando il nome della variabile 'voce' per due volte, a significare due cose diverse.

0

Si riassegna l'elemento ai valori in z mentre si scorre su z. Quindi la prima volta nel tuo ciclo for, item = 0, next item = 1, ecc ... Non stai mai controllando una lista contro l'altra.

di farlo in modo molto esplicito:

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

Utilizzando lista di comprensione:

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

o utilizzando la funzione di filtro:

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

Utilizzando set in qualsiasi forma può creare un bug, se l'elenco che viene controllato contiene elementi non univoci, ad es:

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 di lista come sopra

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

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

o la funzione di filtro:

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

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

Nel caso in cui item e z sono iteratori ordinati, siamo in grado di ridurre la complessità da O(n^2) a O(n+m) facendo ciò

Se i due sono iteratori, abbiamo anche la possibilità di ridurre l'ingombro di memoria non memorizzando z (exclude_sorted_iterator) come un elenco.

+0

per loop (che è la risposta approvata) big Oh è 'O (n)' e la tua risposta ha un ciclo annidato un po 'in ciclo, quindi la complessità aumenterà nel tuo caso che è 'O (n^2)' –

Problemi correlati