Comprehension in Python
Obiettivi della pillola
Alla fine di questa pillola saprai:
- comprendere la sintassi delle comprehension in Python;
- creare liste, insiemi e dizionari in modo compatto ed elegante;
- applicare condizioni (
if) e cicli annidati nelle comprehension; - distinguere tra i vari tipi di comprehension (
list,set,dict,generator).
Cos’è una comprehension
Una comprehension è un modo conciso per costruire collezioni a partire da iterabili (liste, range, stringhe, ecc.), usando la sintassi:
[espressione for elemento in iterabile if condizione]
Le comprehension esistono per:
- Liste →
[ ... ] - Set →
{ ... } - Dizionari →
{ chiave: valore for ... } - Generator expression →
( ... )
List comprehension
Esempio base
numeri = [1, 2, 3, 4, 5]
quadrati = [x**2 for x in numeri]
print(quadrati) # [1, 4, 9, 16, 25]
Con condizione
pari = [x for x in range(10) if x % 2 == 0]
print(pari) # [0, 2, 4, 6, 8]
Con espressione condizionale
etichetta = ["pari" if x % 2 == 0 else "dispari" for x in range(5)]
print(etichetta) # ['pari', 'dispari', 'pari', 'dispari', 'pari']
Con cicli annidati
prodotti = [(x, y) for x in [1,2,3] for y in [10,20]]
print(prodotti) # [(1,10), (1,20), (2,10), (2,20), (3,10), (3,20)]
Set comprehension
Come le list comprehension, ma usano le graffe. Eliminano automaticamente duplicati.
stringa = "programmazione"
lettere_uniche = {c for c in stringa}
print(lettere_uniche) # ordine casuale, es. {'o','n','m','r','p','i','g','a','z','e'}
quadrati = {x**2 for x in range(6)}
print(quadrati) # {0, 1, 4, 9, 16, 25}
Dict comprehension
Permette di costruire dizionari in una riga.
numeri = [1, 2, 3, 4]
dizionario = {x: x**2 for x in numeri}
print(dizionario) # {1:1, 2:4, 3:9, 4:16}
testo = "banana"
conteggio = {c: testo.count(c) for c in set(testo)}
print(conteggio) # {'b':1, 'a':3, 'n':2}
Generator expression
Come le list comprehension ma tra parentesi tonde: producono valori “al volo” senza creare l’intera lista in memoria.
gen = (x**2 for x in range(5))
print(next(gen)) # 0
print(next(gen)) # 1
print(list(gen)) # [4, 9, 16]
Esempi pratici
Filtrare numeri primi (semplificato)
numeri = range(2,20)
primi = [x for x in numeri if all(x % d != 0 for d in range(2,x))]
print(primi) # [2, 3, 5, 7, 11, 13, 17, 19]
Trasformare stringhe
nomi = ["luca", "maria", "giovanni"]
maiuscoli = [n.upper() for n in nomi]
print(maiuscoli) # ['LUCA', 'MARIA', 'GIOVANNI']
Matrice piatta (flatten)
matrice = [[1,2],[3,4],[5,6]]
piatta = [x for riga in matrice for x in riga]
print(piatta) # [1, 2, 3, 4, 5, 6]
Invertire dizionario
materie = {"ita":7, "mat":8, "inf":9}
invertito = {v:k for k,v in materie.items()}
print(invertito) # {7:'ita', 8:'mat', 9:'inf'}
Confronto finale
- List comprehension: produce una lista (ordinata, duplicati ammessi).
- Set comprehension: produce un set (non ordinato, senza duplicati).
- Dict comprehension: produce un dizionario (chiave:valore).
- Generator expression: produce valori uno alla volta, utile con grandi dati.
In breve: le comprehension rendono il codice più compatto e leggibile. Sperimenta con condizioni e cicli annidati per creare trasformazioni potenti in poche righe!
EC