01: List Comprehensions

Python 3 - Lezioni su Concetti Intermedi

01: List Comprehensions

In questo nuovo episodio imparerete un nuovo fantastico e semplice metodo per creare liste e sottoliste in Python, chiamato List Comprehensions.

Personalmente, sono un grande fan di questa tecnica, perché rende i nostri programmi estremamente più facili da leggere, e perché ci fa risparmiare davvero un sacco di tempo.

Spiegheró le List Comprehension nello stesso modo in cui le ho imparate io, facendo un confronto con la modalità diciamo "classica" di creazione di liste che abbiamo visto fin'ora. Spesso e volentieri, una lista è formata da elementi provenienti da altre sequenze su cui sono state svolte determinate operazioni, o da sottosequenze che rispettano determinate condizioni.

Ad esempio, supponiamo di aver bisogno di una lista di quadrati a partire da un elenco di numeri.

La prima cosa che probabilmente vi starà venendo in mente è:
1) Creiamo una lista vuota
2) Aggiungiamo a questa lista i quadrati dei numeri da elevare, il tutto utilizzando un ciclo for

quadrati = []

for n in range(10):
    quadrati.append(n**2)

print(quadrati)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Tutto chiaro fin qui, giusto? Lasciate che vi mostri ora come possiamo ottenere lo stesso risultato, ma impiegando stavolta le List Comprehensions:

quadrati = [n**2 for n in range(10)]

print(quadrati)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Bella differenza no? Da una parte abbiamo usato tre righe di codice, mentre qui, semplicemente una. Inoltre è facile notare quanto la sintassi sia praticamente identica all'inglese parlato.

Stiamo dicendo voglio una lista di quadrati e dentro ci voglio il quadrato di n per ciascun n dell'intervallo.

Quindi, una List Comprehension è creata utilizzando delle parentesi quadre contenenti al loro interno un'espressione, un ciclo for ed eventuali if se necessari.

Facciamo un altro esempio. Supponiamo ora di avere due liste di numeri:

lista1 = [1, 2, 3]
lista2 = [3, 1, 4]

Abbiamo bisogno di combinare i valori presenti in queste due liste, purché questi siano diversi tra loro. Possiamo utilizzare un annidamento di cicli for, in questa maniera:

mix = []

for x in lista1:
    for y in lista2:
        if x != y:
            mix.append((x,y))
            
print(mix)
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

Oppure, molto più semplicemente, rivolgerci alle List Comprehension e svolgere il tutto con una singola riga di codice:

mix = [(x, y) for x in lista1 for y in lista2 if x != y]

print(mix)
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

Allo stesso modo possiamo anche richiamare un metodo su ciascuno dei valori con cui vogliamo comporre la lista, oppure passarlo a una funzione.

Ad esempio, supponiamo di aver bisogno di una lista contenente la versione stringata dei numeri contenuti in lista1. Con una List Comprehension ci basta fare:

stringati = [str(n) for n in lista1]
print(stringati)
['1', '2', '3']

Mentre utilizzando un for loop avremmo dovuto fare:

stringati = []
for n in lista1:
    stringati.append(str(n))

print(stringati)
['1', '2', '3']
Menu della Serie