python comprehension liste dizionari

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!