Elenco delle comprensioni in Python

La comprensione delle liste ti fornisce un modo di scrivere per loop in modo più conciso. Possono essere utili quando si desidera creare nuovi elenchi da elenchi esistenti o iterabili. Ad esempio, è possibile utilizzare le list comprehensions per creare un elenco di quadrati da un elenco di numeri. Allo stesso modo, è possibile utilizzare alcune condizioni in un elenco di numeri in modo che il nuovo elenco creato sia un sottoinsieme dell'elenco originale. 

Tieni presente che non puoi scrivere tutti per loop come una lista di comprensione. Ancora una cosa: il nome "list comprehensions" può essere un po 'confuso perché sembra suggerire che le comprensioni sono pensate solo per lavorare con le liste. In realtà, la parola "elenco" nelle list comprehensions viene utilizzata per indicare che è possibile eseguire il loop su qualsiasi iterabile in Python e il prodotto finale sarebbe un elenco. 

Loop e Comprensioni delle liste

Le comprensioni di base delle liste che non usano nessuna condizione hanno la seguente forma:

[ per  nel ]

Iniziamo scrivendo un concetto molto basilare per loop per elencare i primi 15 multipli di 5. In primo luogo, è necessario creare una lista vuota. Quindi, devi scorrere su un intervallo di numeri e moltiplicarli per 5. La nuova sequenza di numeri che ottieni sarà composta da multipli di 5. 

multipli = [] per n nell'intervallo (1,16): multiples.append (n * 5) print (multipli) # [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75] 

Quanto sopra per loop ha fondamentalmente la seguente struttura: 

per  nel :  

Se lo paragoni con il modulo di comprensione delle liste che hai letto prima, puoi vederlo è n, è range (1,16), e è n * 5. Mettere questi valori nella comprensione della lista ci darà il seguente risultato:

multipli = [n * 5 per n nell'intervallo (1,15)] multipli # [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70]

Allo stesso modo, puoi anche ottenere una lista con il cubo di numeri dati come questo:

cubi = [n ** 3 per n nell'intervallo (1,16)] stampa (cubi) # [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000, 1331, 1728, 2197, 2744 , 3375]

Condizioni nelle comprensioni delle liste

Puoi anche usare un Se condizione di filtrare determinati valori dall'elenco finale. In questo caso, la comprensione della lista assume la seguente forma:

[ per  nel  Se ]

Un esempio di base di questo tipo di comprensione sarebbe ottenere tutti i numeri pari in un dato intervallo. UN per loop per fare questo compito sarà simile a questo:

evens = [] per n nell'intervallo (1,21): if n% 2 == 0: evens.append (n) print (evens) # [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

La stessa cosa potrebbe essere ottenuta usando la seguente lista di comprensione:

evens = [n per n nell'intervallo (1,21) if n% 2 == 0] print (evens) # [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

Un esempio più complesso di utilizzo delle list comprehensions potrebbe essere aggiunto … se altro… espressioni condizionali al loro interno. 

In questo caso, l'ordine in cui esponi le affermazioni all'interno della comprensione delle liste sarà diverso dal solito Se condizioni. Quando hai solo un Se condizione, la condizione va alla fine della comprensione. Tuttavia, nel caso di un … se altro… espressione, le posizioni del per loop e l'espressione condizionale sono scambiati. Il nuovo ordine è:

[ Se  altro  per  nel ]

Iniziamo scrivendo il verboso … se altro…  espressione condizionale per ottenere quadrati di numeri pari e cubi di numeri dispari in un dato intervallo.

squares_cubes = [] per n nell'intervallo (1,16): if n% 2 == 0: squares_cubes.append (n ** 2) else: squares_cubes.append (n ** 3) print (squares_cubes) # [1, 4, 27, 16, 125, 36, 343, 64, 729, 100, 1331, 144, 2197, 196, 3375]

L'espressione condizionale di cui sopra ha la seguente struttura:

per  nel : Se :  altro: 

Mettere i valori corrispondenti nei posti giusti ti darà la seguente lista di comprensione:

squares_cubes = [n ** 2 if n% 2 == 0 else n ** 3 per n in range (1,16)] print (squares_cubes) # [1, 4, 27, 16, 125, 36, 343, 64 , 729, 100, 1331, 144, 2197, 196, 3375]

Elenco delle conclusioni per i cicli annidati

Puoi anche usare cicli annidati all'interno di una comprensione di lista. Non c'è limite al numero di per loop che puoi inserire in una lista di comprensione. Tuttavia, devi tenere presente che l'ordine dei loop dovrebbe essere lo stesso sia nel codice originale che nella comprensione delle liste. Puoi anche aggiungere un optional Se condizione dopo ciascuno per ciclo continuo. Una comprensione di lista con annidato per i loop avranno la seguente struttura:

[  per  nel  (facoltativo se ) per  nel  (facoltativo se ) per  nel  (facoltativo se )… e così via… ]

I seguenti esempi dovrebbero rendere tutto più chiaro. Ci sono due cicli annidati, e moltiplicandoli insieme ci danno tabelle di moltiplicazione.

moltiplicazioni = [] per i in range (1, 4): per n nell'intervallo (1, 11): multiplications.append (i * n) print (moltiplicazioni) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30] 

Questi nidificati per i loop possono essere riscritti come:

per  nel : per  nel : 

Una volta che hai scritto il ciclo in questo modulo, convertirlo in una lista di comprensione è facile:

moltiplicazioni = [i * n per i in range (1,4) per n in range (1,11)] print (moltiplicazioni) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30]

Puoi anche usare una comprensione di lista scritta in modo simile per appiattire un elenco di liste. L'esterno per il ciclo scorre le singole liste e le memorizza nella variabile riga. L'interno per il ciclo andrà quindi a scorrere tutti gli elementi nel corrente riga. Durante la prima iterazione, la variabile riga ha il valore [1, 2, 3, 4]. Il secondo ciclo itera attraverso questa lista o riga e aggiunge tutti quei valori all'elenco finale.

matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12],] flatten = [n per riga in matrice per n in riga] stampa (appiattisci ) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

Comprensioni di liste annidate

La comprensione delle liste annidate può sembrare simile alla comprensione delle liste con cicli annidati, ma sono molto diversi. Nel primo caso, avevi a che fare con loop all'interno di loop. In questo caso, avrai a che fare con la comprensione delle liste all'interno delle list comprehensions. Un buon esempio di utilizzo delle comprensioni di liste annidate sarebbe la creazione di una trasposizione della matrice per la sezione precedente.

Senza un'espressione di comprensione di lista, dovrai usarne due per loop per creare la trasposizione.

matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12],] transpose = [] per i in range (4): temp = [] per riga in matrice: temp.append (riga [i]) transpose.append (temp) print (trasporre) # [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

Il ciclo esterno esegue l'iterazione attraverso la matrice quattro volte perché ci sono quattro colonne in essa. Il ciclo interno scorre gli elementi all'interno della riga corrente un indice alla volta e lo aggiunge a un elenco temporaneo chiamato Temp. Il Temp l'elenco viene quindi aggiunto come una riga alla matrice trasposta. Nel caso delle comprensioni di liste annidate, il ciclo più esterno arriva alla fine e il ciclo più interno arriva all'inizio. 

Ecco il codice sopra riportato sotto forma di una comprensione di lista:

matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12],] trasposizione = [[riga [n] per riga in matrice] per n in range (4)] print (trasporre) # [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

Un altro modo di considerare questo è considerare la struttura delle comprensioni delle liste che sostituiscono la base per cicli che hai imparato all'inizio dell'articolo.

[ per  nel ]

Se lo paragoni con la comprensione dell'elenco annidato sopra, lo vedrai in questo caso è in realtà un'altra comprensione di lista: [riga [n] per riga in matrice]. Questa comprensione dell'elenco annidato è sotto forma di base per ciclo continuo.

Pensieri finali

Spero che questo tutorial ti abbia aiutato a capire quali sono le list comprehensions e come usarle al posto di base per loop per scrivere codice conciso e leggermente più veloce durante la creazione di elenchi. 

Un'altra cosa che dovresti tenere a mente è la leggibilità del tuo codice. La creazione di liste di comprensione per cicli annidati renderà probabilmente il codice meno leggibile. In questi casi, è possibile suddividere la comprensione dell'elenco in più righe per migliorare la leggibilità.

Inoltre, non esitare a vedere ciò che abbiamo a disposizione per la vendita e per studiare su Envato Market, e non esitare a fare domande e fornire il tuo prezioso feedback usando il feed qui sotto.