La list comprehension in python
Cos'è la list comprehension? E' una tecnica procedurale per creare liste nel linguaggio python.
A cosa serve? Permette di scrivere un espressione tramite delle clausole e condizioni, in grado di creare automaticamente una lista con determinati valori. Grazie alla list comprehnsion, una espressione svolge il lavoro di più istruzioni e righe di codice.
Come funziona la list comprehnsion
L'espressione deve essere scritta all'interno delle parentesi [ ] perché l'output è una lista di elementi.
[ espressione ]
L'espressione può essere composta da comandi, clausole e calcoli matematici.
Un esempio pratico
Voglio creare una lista composta da numeri da 0 a 9.
nomelista = [ i for i in range(10) ]
L'espressione [ i for i in range(10) ] assegna il valore i a ogni elemento in un ciclo di dieci iterazioni.
La lista viene creata automaticamente con i seguenti contenuti:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Se avessi voluto ottenere lo stesso risultato con le istruzioni di un programma, avrei dovuto scrivere tre righe di codice:
nomelista=[]
for x in range(10):
nomelista.append(x)
E' quindi più rapido usare la list comprehension.
Esempi pratici di list comprehension
Ecco una lista di esempi pratici per capire meglio il funzionamento della list comprehension in python.
Esempio 1
Per creare una lista composta dai quadrati dei numeri da 0 a 9 scrivo:
nomelista=[x**2 for x in range(10)]
Il risultato è una lista con i seguenti elementi:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Esempio 2
Per leggere gli elementi di una lista, moltiplicarli per un valore e assegnare il risultato a un'altra lista scrivo:
lista1=[3,4,5]
lista2=[item*2 for item in lista1]
In questo caso l'espressione legge gli elementi ( item ) della lista1, li moltiplica per 2 e assegna il prodotto alla lista2
L'espressione crea la lista lista2 con i seguenti elementi:
[6, 8, 10]
Esempio 3
In questa espressione aggiungo una condizione al calcolo.
lista1=[3,4,5]
lista3=[item*2 for item in lista1 if item % 2 == 0]
In questo caso ho aggiunto una condizione if "item % 2 == 0" all'espressione.
L'espressione effettua il calcolo (item*2) soltanto se il valore dell'elemento (item) della lista1 è divisibile per due senza resto (item % 2 == 0), ossia è un numero pari.
L'espressione crea la lista lista3 con i seguenti elementi:
[8]
Ha creato un solo elemento perché lista1 è composta dagli elementi [3,4,5] e soltanto uno e pari (4).
Quindi 4*2 è uguale a 8.
Esempio 4
In questa espressione leggo la lettera iniziale degli elementi alfanumerici della lista1 e la assegno alla lista2
lista1=["Roma", "Napoli", "Firenze"]
lista2 = [ word[0] for word in lista1 ]
L'espressione crea la lista lista2 con i seguenti elementi:
['R', 'N', 'F']
Esempio 5
In questo esempio trasformo in maiuscolo tutti gli elementi di una lista:
lista1=["Roma", "Napoli", "Firenze"]
lista2 = [ x.upper() for x in lista1 ]
Il risultato finale in lista2 è il seguente:
['ROMA', 'NAPOLI', 'FIRENZE']
Per trasformarli in minuscolo mi basta scrivere la funzione opposta ( lower )
lista2 = [ x.lower() for x in lista1 ]
Ora il contenuto di lista2 è il seguente:
['roma', 'napoli', 'firenze']
Esempio 6
In questa espressione voglio selezionare da una stringa soltanto gli elementi numerici:
stringa="Guida Python 2018"
lista1 = [x for x in stringa if x.isdigit()]
Il risultato finale in lista1 è il seguente:
['2', '0', '1', '8']
Per selezionare soltanto gli elementi alfanumerici, invece, devo usare il metodo isalpha().
lista1 = [x for x in stringa if x.isalpha()]
Ora il contenuto di lista1 è il seguente:
['G', 'u', 'i', 'd', 'a', 'P', 'y', 't', 'h', 'o', 'n']
Esempio 7
La list comprehension python mi permette anche di fare una ricerca in un file.
Ho il file "test.txt" con tre record:
Corso Python a Roma
Corso Cobol a Milano
Corso C a Verona
Per selezionare con un espressione tutti i record del file che contengono il termine "Python"
fh = open("test.txt", "r")
lista1 = [i for i in fh if "Python" in i]
L'espressione seleziona soltanto un record e lo aggiunge alla lista
Corso Python a Roma
E così via.