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.
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:
pernel :
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]
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:
pernel : 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]
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:
pernel : 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]
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.
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.