Elenco di comprensione con l’istruzione if

Voglio confrontare 2 iterables e stampare gli elementi che compaiono in entrambi i iterables.

>>> 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 valida dove il ^ è stato inserito.
Cosa c’è di male in questo lamba funzione?

  • tutte le risposte qui di seguito sono di destra, ma anche b = ('q') non creare una tupla. Tuple con un elemento necessario un esplicito ,, che è b = ('q',)
  • Ho cambiato tuples in iterables.
InformationsquelleAutor OrangeTux | 2013-03-18



4 Replies
  1. 160

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

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

    Questo avrebbe funzionato, però:

    [y if y not in b else other_value for y in a]
    • Grazie. Ho visto questo post stackoverflow.com/questions/4406389/… circa un’istruzione if else, in una funzione lambda. E ho pensato che, utilizzando solo l’istruzione if (senza l’altro) sarebbe un lavoro nello stesso ordine.
  2. 37

    Hai messo il if alla fine:

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

    List comprehensions sono scritti nello stesso ordine come loro nidificati pieno specificato controparti, essenzialmente la dichiarazione di cui sopra si traduce in:

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

    La versione cercato di fare invece:

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

    ma un elenco di comprensione deve iniziare con almeno uno ciclo esterno.

    • Sei stato molto utile. Grazie.
  3. 5

    Questa non è una funzione lambda. Si tratta di un elenco di comprensione.

    Basta cambiare l’ordine:

    [ y for y in a if y not in b]
    • Di corso. Stupido.
  4. 5

    elenco comprensione formula:

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

    quindi si può fare così:

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

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

    • Non si può mettere un else in un elenco di comprensione, non dove hai messo almeno uno. Non confondere un elenco di comprensione (filtro), con una espressione condizionale (che deve avere un valore, rendendo l’espressione else obbligatorio).
    • D’accordo. else essere utilizzato in lista di comprensione, anche se, come illustrato nel codice.
    • Questo è un espressione condizionale. Può essere usato ovunque, una valida espressione è applicabile. Non è specifico per genericità elenco.

Lascia un commento