Menu

List comprehension in Python: sintassi, filtri e dict comprehension

Le list comprehension ti permettono di costruire una nuova lista in una sola riga leggibile, trasformando, filtrando o entrambe le cose, al posto dello schema ciclo più append.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

Una riga, un'idea

Hai già scritto questo schema diverse volte: parti da una lista vuota, scorri qualcosa con un ciclo, magari filtri, e aggiungi al risultato.

Una list comprehension dice la stessa cosa in una riga:

Leggila da sinistra a destra: "una nuova lista fatta di n * 2, per ogni n in numbers." La struttura è [expression for item in iterable].

Non è un trucco esclusivo di Python: si chiama comprehension perché descrivi in modo dichiarativo cosa entra nella nuova lista, invece di scrivere i passaggi meccanici per costruirla.

Aggiungere un filtro

Metti una clausola if dopo la parte del ciclo per filtrare:

Leggi la seconda così: "n * n per ogni n in numbers, ma solo se n è dispari."

Il ciclo equivalente:

Vanno bene entrambi. La comprehension è più corta e, dopo averne lette un po', diventa anche più facile da scorrere con gli occhi, perché l'intenzione è tutta lì in una riga.

Trasformare e filtrare insieme

Puoi far passare i valori attraverso una funzione e filtrare allo stesso tempo:

Per ogni parola più lunga di 3 lettere, includi la sua versione in maiuscolo.

Cicli annidati in una comprehension

Due for producono coppie in stile prodotto cartesiano:

L'ordine è lo stesso che avresti annidando i cicli: il primo for è quello esterno, il secondo quello interno. Si legge da sinistra a destra come il ciclo indentato equivalente.

Due livelli sono più o meno il limite oltre il quale un ciclo normale si legge meglio. Se arrivi a tre, torna ai cicli.

Dict e set comprehension

Stessa idea, parentesi diverse:

A prima vista le set comprehension sembrano identiche alle dict comprehension: la differenza è key: value contro una singola espressione. Graffe più : = dict; graffe senza : = set.

Espressioni generatore

Quasi gemelle delle list comprehension, ma con le parentesi tonde invece delle quadre e, soprattutto, non costruiscono una lista:

Nota che abbiamo passato il generatore direttamente a sum() e any(), senza parentesi in più. Le espressioni generatore sono lo strumento giusto quando chi le riceve deve scorrere i valori una volta sola. Con collezioni grandi occupano molta meno memoria di una lista completa.

Quando usare invece un ciclo normale

Le comprehension sono seducenti. Tecnicamente puoi infilarci dentro parecchia roba. Non dovresti.

Scegli un ciclo semplice quando:

  • La trasformazione richiede più di un passaggio. Se ti servono variabili intermedie, scrivila per esteso.
  • C'è una gestione degli errori o una ramificazione complessa.
  • Chi legge la riga deve fermarsi più di una volta per capirla.

La regola che applico: se riesco a leggere la comprehension tutta d'un fiato e capire cosa fa, resta. Se inciampo, la riscrivo come ciclo.

Alcune comprehension sembrano furbe ma fanno danni:

Stesso risultato. La versione con il ciclo occupa cinque righe invece di una, ma "più lungo" non significa "peggiore".

Qualche schema che riutilizzerai

Questi schemi coprono una quantità sorprendente del lavoro quotidiano con i dati.

Prossimo argomento

Ora hai visto i principali tipi di collezione e la comprehension che li tiene insieme. Prossimo capitolo: le funzioni, per impacchettare comportamenti in unità riutilizzabili e con un nome.

Domande frequenti

Cos'è una list comprehension in Python?

Una sintassi compatta per costruire una nuova lista a partire da un iterabile esistente. [x * 2 for x in numbers] crea una nuova lista con ogni numero raddoppiato. Puoi anche filtrare: [x for x in numbers if x > 0].

Quando non dovrei usare una list comprehension?

Quando peggiora la leggibilità. Se l'espressione all'interno è complessa o molto annidata, un normale ciclo for con nomi di variabile chiari si capisce meglio. Le comprehension servono per trasformazioni semplici: mappare e filtrare. Qualsiasi cosa più complessa sta meglio in un ciclo completo.

Che differenza c'è tra una list comprehension e un'espressione generatore?

Una list comprehension costruisce l'intera lista in memoria. Un'espressione generatore (stessa sintassi ma con le parentesi tonde) produce un elemento alla volta. Usa un generatore quando passi i risultati a qualcosa che li scorre una volta sola, come sum(...), così non crei una lista che butteresti via subito.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA