2013-03-18 26 views
57

Desidero confrontare 2 iterables e stampare gli elementi visualizzati in entrambi i iterabili.Comprensione delle liste con istruzione if

>>> a = ('q', 'r') 
>>> b = ('q') 


# Iterate over a. If y not in b, print y. 
# I want to see ['r'] printed. 
>>> print([ y if y not in b for y in a]) 
          ^

Ma mi dà un errore di sintassi nullo se il ^ è stata posta. Cosa c'è di sbagliato in questa funzione di lamba?

+5

tutte le risposte qui sotto sono giuste, ma anche 'b = ('q')' non crea una tupla. Le tuple con un elemento hanno bisogno di un esplicito ',', che è 'b = ('q',)' – dmg

+0

Ho cambiato 'tuple' in' iterabili'. – OrangeTux

risposta

105

Hai sbagliato l'ordine. Il if dovrebbe essere dopo la for (a meno che non si trova in un operatore if-else ternario)

[y for y in a if y not in b] 

Ciò funzionerebbe comunque:

[y if y not in b else other_value for y in a] 
+0

Grazie. Ho visto questo post http://stackoverflow.com/questions/4406389/if-else-in-a-list-comprehension su un'istruzione if else in una funzione lambda. E pensavo che usare solo l'istruzione if (senza il resto) avrebbe funzionato nello stesso ordine. – OrangeTux

4

Questa non è una funzione lambda. È una comprensione di lista.

Basta cambiare l'ordine:

[ y for y in a if y not in b] 
+0

Ovviamente. Stupido. – OrangeTux

28

si mette la if alla fine:

[y for y in a if y not in b] 

di lista sono scritti nello stesso ordine come le loro controparti full-specificato nidificati, in sostanza quanto sopra la dichiarazione si traduce in:

outputlist = [] 
for y in a: 
    if y not in b: 
     outputlist.append(y) 

La tua versione cercato di fare questo, invece:

outputlist = [] 
if y not in b: 
    for y in a: 
     outputlist.append(y) 

ma una lista di comprensione must iniziare con almeno un ciclo esterno.

+0

Sei stato molto utile. Grazie. –

3

comprensione elenco formula:

[<value_when_condition_true> if <condition> else <value_when_condition_false> for value in list_name] 

quindi si può fai in questo modo:

[y for y in a if y not in b] 

Solo a scopo dimostrativo: [y se y non in b altrimenti False per y in]

+0

Non puoi inserire un 'else' in una list comprehension, non dove ne hai messo almeno uno. Non confondere una comprensione di lista (filtraggio), con un'espressione condizionale (che deve avere un valore, rendendo obbligatoria l'espressione else). –

+0

Accetto. 'else' essere usato nella comprensione della lista anche se come mostrato nel codice. –

+0

Questa è un'espressione * condizionale *. Può essere utilizzato ovunque sia applicabile un'espressione valida. Non è specifico per la comprensione delle liste. –

Problemi correlati