Python Language Comprensioni di liste condizionali

Esempio

Data una comprensione lista è possibile aggiungere una o più if le condizioni per filtrare i valori.

[<expression> for <element> in <iterable> if <condition>]

Per ogni <element> in <iterable> ; se <condition> restituisce True , aggiungere <expression> (di solito una funzione di <element> ) all'elenco restituito.


Ad esempio, questo può essere usato per estrarre solo numeri pari da una sequenza di numeri interi:

[x for x in range(10) if x % 2 == 0]
# Out: [0, 2, 4, 6, 8]

Dimostrazione dal vivo

Il codice sopra è equivalente a:

even_numbers = [] 
for x in range(10):
    if x % 2 == 0:
        even_numbers.append(x)

print(even_numbers)
# Out: [0, 2, 4, 6, 8]

Inoltre, una comprensione dell'elenco condizionale della forma [e for x in y if c] (dove e c sono espressioni in termini di x ) è equivalente alla list(filter(lambda x: c, map(lambda x: e, y))) .

Nonostante fornisca lo stesso risultato, presta attenzione al fatto che l'esempio precedente è quasi 2x più veloce di quest'ultimo. Per coloro che sono curiosi, questa è una bella spiegazione del motivo per cui.


Si noti che questo è molto diverso dall'espressione condizionale ... if ... else ... (a volte nota come espressione ternaria ) che è possibile utilizzare per la parte <expression> della list comprehension. Considera il seguente esempio:

[x if x % 2 == 0 else None for x in range(10)]
# Out: [0, None, 2, None, 4, None, 6, None, 8, None]

Dimostrazione dal vivo

Qui l'espressione condizionale non è un filtro, ma piuttosto un operatore che determina il valore da utilizzare per gli elementi dell'elenco:

<value-if-condition-is-true> if <condition> else <value-if-condition-is-false>

Questo diventa più ovvio se lo si combina con altri operatori:

[2 * (x if x % 2 == 0 else -1) + 1 for x in range(10)]
# Out: [1, -1, 5, -1, 9, -1, 13, -1, 17, -1]

Dimostrazione dal vivo

Se si utilizza Python 2.7, xrange può essere migliore range per diversi motivi, come descritto nella documentazione di xrange .

[2 * (x if x % 2 == 0 else -1) + 1 for x in xrange(10)]
# Out: [1, -1, 5, -1, 9, -1, 13, -1, 17, -1]

Il codice sopra è equivalente a:

numbers = []
for x in range(10):
    if x % 2 == 0:
        temp = x
    else:
        temp = -1
    numbers.append(2 * temp + 1)
print(numbers)
# Out: [1, -1, 5, -1, 9, -1, 13, -1, 17, -1]

Si può combinare espressioni ternari e if le condizioni. L'operatore ternario lavora sul risultato filtrato:

[x if x > 2 else '*' for x in range(10) if x % 2 == 0]
# Out: ['*', '*', 4, 6, 8]

Lo stesso non poteva essere raggiunto solo dall'operatore ternario:

[x if (x > 2 and x % 2 == 0) else '*' for x in range(10)]
# Out:['*', '*', '*', '*', 4, '*', 6, '*', 8, '*']

Vedi anche: Filtri , che spesso forniscono un'alternativa sufficiente alle comprensioni delle liste condizionali.