Vai al contenuto
eLearner.app
Modulo 6 · Lezione 1 di 421/36 nel corso~12 min
Lezioni del modulo (1/4)

List comprehension

Una list comprehension è un'espressione che costruisce una lista applicando una trasformazione (e opzionalmente un filtro) a un iterabile. È la forma pythonica per scrivere for + append in una riga.

Python
# stile imperativo (verboso)
quadrati = []
for n in range(5):
    quadrati.append(n * n)

# stile pythonico
quadrati = [n * n for n in range(5)]
# [0, 1, 4, 9, 16]

Sintassi completa

Python
[espressione for elemento in iterabile if condizione]
  • espressione: cosa mettere nella lista risultato
  • for elemento in iterabile: ciclo sorgente
  • if condizione (opzionale): filtra solo gli elementi che soddisfano
Python
pari = [n for n in range(10) if n % 2 == 0]
# [0, 2, 4, 6, 8]

maiuscole = [p.upper() for p in ["ciao", "mondo"]]
# ['CIAO', 'MONDO']

lunghe = [p for p in ["a", "bb", "ccc", "dddd"] if len(p) >= 3]
# ['ccc', 'dddd']

if/else nell'espressione (ternario)

Per trasformare in modo condizionato (anziché filtrare), usa l'espressione ternaria PRIMA del for:

Python
[n if n > 0 else 0 for n in [-2, -1, 0, 1, 2]]
# [0, 0, 0, 1, 2]

Multi-for: prodotto cartesiano

Puoi annidare più for:

Python
coppie = [(x, y) for x in range(3) for y in range(2)]
# [(0,0), (0,1), (1,0), (1,1), (2,0), (2,1)]

L'ordine dei for è "esterno-prima-interno", come se fossero loop annidati.

Quando NON usare la comprehension

  • Logica complessa con molti if/else annidati → usa un loop esplicito.
  • Effetti collaterali (print, write su file) → loop, non comprehension.
  • Più di 2 livelli annidati → quasi sempre meglio un loop con nome.

List comprehension annidate

È possibile inserire più di un ciclo for all'interno di una list comprehension. Ad esempio, per "appiattire" una matrice (lista di liste) in una lista singola puoi scrivere:

Python
matrice = [[1, 2], [3, 4]]
appiattita = [elemento for riga in matrice for elemento in riga]
# risultato: [1, 2, 3, 4]

L'ordine dei cicli rispecchia esattamente quello dei cicli for annidati tradizionali.

Prova tu

Esercizio#python.m6.l1.e1
Tentativi: 0Caricamento…

Data `nums = [1, 2, 3, 4, 5, 6]`, costruisci `even_squares` con i quadrati dei soli numeri pari. Valuta `even_squares`.

Caricamento editor…
Mostra suggerimento

if n % 2 == 0 alla fine.

Soluzione disponibile dopo 3 tentativi

Esercizio di ripasso

Esercizio#python.m6.l1.e2
Tentativi: 0Caricamento…

Data `words = ['Ciao', 'Mondo', 'Python', 'Java']`, costruisci `lengths` con le lunghezze di OGNI parola, e `short_words` con solo le parole < 5 caratteri. Valuta `(lengths, short_words)`.

Caricamento editor…
Mostra suggerimento

Due comprehensions separate.

Soluzione disponibile dopo 3 tentativi

Sfida aggiuntiva

Esercizio#python.m6.l1.e3
Tentativi: 0Caricamento…

Usa una list comprehension per calcolare i quadrati dei soli numeri pari compresi tra 1 e 10 (inclusi). Salva la lista in `even_squares` e valutala.

Caricamento editor…
Mostra suggerimento

Usa range(1, 11) per scorrere i numeri, if x % 2 == 0 per filtrare, e x**2 come espressione.

Soluzione disponibile dopo 3 tentativi