Comprensione dell'elenco con l'istruzione if


106

Voglio confrontare 2 iterabili e stampare gli elementi che appaiono in entrambi gli iterabili.

>>> 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 non valido in cui ^è stato inserito. Cosa c'è di sbagliato in questa funzione lamba?


5
tutte le risposte seguenti sono corrette, ma b = ('q')non creano nemmeno una tupla. Le tuple con un elemento necessitano di un esplicito ,, ovverob = ('q',)
dmg

Mi sono trasformato tuplesin iterables.
OrangeTux

Risposte:


187

Hai sbagliato l'ordine. L' ifdovrebbe essere dopo la for(a meno che non si trova in un if-elseoperatore ternario)

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

Tuttavia, funzionerebbe:

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

Grazie. Ho visto questo post stackoverflow.com/questions/4406389/… su un'istruzione if else in una funzione lambda. E ho pensato che usare solo l'istruzione if (senza l'ennesima) avrebbe funzionato nello stesso ordine.
OrangeTux

39

ifAlla fine metti :

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

Le liste di comprensione sono scritte nello stesso ordine delle loro controparti completamente specificate annidate, essenzialmente la dichiarazione di cui sopra si traduce in:

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

La tua versione ha provato a farlo invece:

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

ma una comprensione della lista deve iniziare con almeno un ciclo esterno.


Sei stato molto utile. Grazie.
Tolgahan ÜZÜN

7

formula di comprensione delle liste:

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

quindi puoi farlo in questo modo:

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

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


2
Non puoi mettere un elsein una lista di comprensione, non dove ne metti almeno uno. Non confondere una lista di comprensione (filtraggio) con un'espressione condizionale (che deve avere un valore, rendendo obbligatoria l'espressione else).
Martijn Pieters

Essere d'accordo. elseessere utilizzato nella comprensione delle liste sebbene come mostrato nel codice.
Vishvajit Pathak

2
Questa è un'espressione condizionale . Può essere utilizzato ovunque sia applicabile un'espressione valida. Non è specifico per elencare le comprensioni.
Martijn Pieters

5

Questa non è una funzione lambda. È una comprensione delle liste.

Basta cambiare l'ordine:

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

-2

Ho ricercato e provato i suggerimenti sopra menzionati di comprensione degli elenchi per la mia situazione come descritto di seguito, tuttavia non ha funzionato. Cosa sto facendo di sbagliato qui?

sent_splt=[['good', 'case,', 'excellent', 'value.'], ['great', 'for', 'the', 'jawbone.'],['tied', 'to', 'charger', 'for', 'conversations', 'lasting', 'more', 'than', '45', 'minutes.major', 'problems!!']]

stop_set = ['the', 'a', 'an', 'i', 'he', 'she', 'they', 'to', 'of', 'it', 'from']

x=[a for a in sent_splt if a not in stop_set]
print(x)

Non sta filtrando le parole.


1
Quello che devi fare è porre una domanda. Non pubblicare una risposta.
Whirl Mind

In realtà, sta dicendo di pubblicare una domanda dopo 1 giorno di pausa dagli ultimi 2 giorni per me. Fondamentalmente non sono autorizzato a pubblicare domande a causa della mia domanda precedente che non era secondo lo standard stackoverflow. Ci scusiamo per l'inconveniente.
Deepak Dhiman il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.