List comprehension in Python: sintassi, esempi e quando evitarla

  1. Home
  2. Blog
  3. Sviluppo software
Sviluppo software

List comprehension in Python: sintassi, esempi e quando evitarla

Impara la list comprehension di Python passo dopo passo: crea, filtra e trasforma liste in una riga, guarda i tempi misurati rispetto ai cicli e scopri quando un ciclo for è più leggibile.

7 min di lettura
List comprehension in Python: sintassi, esempi e quando evitarla
Punti chiave
  • Lo schema è [espressione for elemento in iterabile if condizione].
  • Un semplice if alla fine filtra; un if-else all’inizio sceglie tra due valori.
  • Nel nostro test la comprehension è stata circa il 37% più veloce di un ciclo con append.
  • Passa a un’espressione generatrice con dati enormi e a un ciclo normale quando la logica richiede più passaggi chiari.

Una list comprehension di Python crea una nuova lista da qualsiasi iterabile in un’unica riga leggibile. Invece di creare una lista vuota, scorrerla e chiamare append, descrivi il risultato che vuoi.

Questa guida va dallo schema di base ai filtri, ai cicli annidati e ai tempi che abbiamo misurato noi stessi. Se Python è nuovo per te, parti dal nostro tutorial Python per principianti (in inglese) e mantieni l’ambiente in ordine con la guida agli ambienti virtuali (in inglese).

Sintassi della list comprehension in Python

Leggila da sinistra a destra: l’espressione dice com’è ogni nuovo elemento, la parte for dice da dove arrivano gli elementi.

squares = [x * x for x in range(6)]
print(squares)          # [0, 1, 4, 9, 16, 25]

names = [" Hi ", "  QA "]
clean = [n.strip().lower() for n in names]
print(clean)            # ['hi', 'qa']

Lo stesso risultato con un ciclo richiede tre righe in più. Quel risparmio è il punto, purché la riga resti facile da leggere.

Filtrare gli elementi con una condizione

Aggiungi un if dopo il ciclo per tenere solo gli elementi che superano la condizione.

evens = [x for x in range(10) if x % 2 == 0]
print(evens)            # [0, 2, 4, 6, 8]

List comprehension in Python con if-else

Quando vuoi un valore per ogni elemento, metti l’if-else prima del for. È la parte in cui i principianti sbagliano di più, perché un else finale è un errore di sintassi.

labels = ["even" if x % 2 == 0 else "odd" for x in range(4)]
print(labels)           # ['even', 'odd', 'even', 'odd']

Regola pratica: un if alla fine elimina elementi, un if-else all’inizio li cambia. Con if-else la lunghezza della lista resta la stessa.

Cicli annidati e appiattimento

Più clausole for si leggono nello stesso ordine dei cicli annidati. Usale per appiattire una lista di liste o per formare coppie.

matrix = [[1, 2, 3], [4, 5, 6]]
flat = [n for row in matrix for n in row]
print(flat)             # [1, 2, 3, 4, 5, 6]

pairs = [(x, y) for x in range(1, 3) for y in "ab"]
print(pairs)            # [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]

Per trasporre la matrice, annida una comprehension dentro un’altra: [[r[i] for r in matrix] for i in range(3)] restituisce [[1, 4], [2, 5], [3, 6]]. Due livelli sono il limite pratico prima che la leggibilità cali.

Forme per dizionario, insieme e generatore

Cambia le parentesi e la stessa idea crea altri tipi.

lengths = {w: len(w) for w in ["pip", "venv", "uv"]}   # {'pip': 3, 'venv': 4, 'uv': 2}
unique  = {len(w) for w in ["pip", "venv", "uv", "git"]}  # {2, 3, 4}
total   = sum(x * x for x in range(1_000_000))           # generator, no list

Confronta i tipi stessi nella nostra guida a liste, tuple, insiemi e dizionari (in inglese).

Velocità e memoria: cosa abbiamo misurato

Abbiamo cronometrato ogni versione su Python 3.13.6 con 100.000 interi, prendendo il migliore di cinque esecuzioni. I tuoi numeri saranno diversi, ma l’ordine è stabile.

AttivitàTempo
Ciclo con append (raddoppiare ogni elemento)5,18 ms
List comprehension (raddoppiare ogni elemento)3,25 ms
list(map(lambda ...))6,50 ms
Filtrare i pari con un ciclo3,62 ms
Filtrare i pari con una comprehension3,43 ms

La comprehension batte chiaramente il ciclo con append, ma il divario si riduce quando la maggior parte del tempo se ne va nella condizione. Per la memoria, una lista di un milione di interi raddoppiati ha occupato circa 8,4 MB, mentre l’oggetto generatore equivalente era di 200 byte, perché produce i valori uno alla volta.

Quando non usare una list comprehension

  • Ti servono solo effetti collaterali, come stampare o salvare. Usa un ciclo normale: una comprehension creerebbe una lista inutile.
  • La logica ha più passaggi. Se ti serve una seconda variabile o un try, scrivi un ciclo o una piccola funzione.
  • I dati sono enormi. Usa un’espressione generatrice così Python non tiene l’intera lista in memoria.
  • Servono più di due clausole for. Dividila in passaggi con nome per chi leggerà dopo.

Conclusioni

Usa una list comprehension di Python quando una riga breve dice esattamente ciò che intendi, e un ciclo quando non è così. Parti dallo schema di base, aggiungi un filtro e poi esercitati con la forma if-else finché l’ordine non ti viene naturale.

Domande frequenti

Che cos’è una list comprehension in Python?

È un modo compatto per creare una lista applicando un’espressione a ogni elemento di un iterabile, con una condizione facoltativa per filtrare.

Come si usa if-else in una list comprehension?

Metti l’espressione condizionale prima della clausola for, per esempio ["even" if x % 2 == 0 else "odd" for x in nums]. Un filtro semplice usa un solo if dopo il ciclo.

Una list comprehension è più veloce di un ciclo for?

Di solito sì. Nel nostro test con 100.000 elementi è stata circa il 37% più veloce di un ciclo con append, ma deve decidere prima la leggibilità.

Qual è la differenza tra list comprehension ed espressione generatrice?

La list comprehension costruisce subito l’intera lista in memoria. L’espressione generatrice usa le parentesi tonde e produce un valore alla volta, risparmiando memoria con dati grandi.

Si possono annidare le list comprehension?

Sì, per appiattire o trasporre una matrice. Resta a due livelli e passa a un ciclo se diventa difficile da leggere.

Continua a imparare (articoli in inglese)

Lavora con Stack Quora

Ti serve aiuto con test, WordPress o SEO?

Aiutiamo i team a rilasciare software migliore e a far crescere i loro siti. Raccontaci a cosa stai lavorando e ti suggeriremo un prossimo passo chiaro.

Continua a leggere

Altre guide su test, intelligenza artificiale e sviluppo moderno

Ti è piaciuto questo articolo? Scegli un argomento e passa direttamente ai nostri tutorial più recenti.

Intelligenza artificiale

Spiegazione delle allucinazioni dell'intelligenza artificiale: perché i modelli linguistici inventano le cose e come ridurle

Spiegazione delle allucinazioni dell'intelligenza artificiale: cosa sono, perché i modelli linguistici le producono, tipi comuni, come ridurle con b…

Leggi l'articolo →
DevOps

Spiegazione delle variabili d'ambiente: file .env, segreti e configurazione eseguiti correttamente

Variabili d'ambiente spiegate con esempi Python che abbiamo eseguito: lettura e impostazione, perché ogni valore è una stringa, file .env, ereditari…

Leggi l'articolo →
Sviluppo software

Spiegazione della limitazione della velocità API: algoritmi, intestazioni e gestione degli errori 429

La limitazione della velocità dell'API spiegata con una simulazione che abbiamo eseguito: bucket di token, finestra fissa, finestra scorrevole, risp…

Leggi l'articolo →
Automazione dei test

Derisione in Python: unittest.mock, patch e gli errori che fanno mentire i test

Mocking in Python con unittest.mock, testato: Mock e return_value, side_effect, patch dove viene utilizzato un nome, specifiche e autospec, date moc…

Leggi l'articolo →
Test del software

Spiegazione della copertura del codice: copertura di linea o di filiale e cosa significa realmente il 100%.

Copertura del codice spiegata con una vera esecuzione di cover.py: copertura di linea, ramo e condizione, lettura di un rapporto, perché la copertur…

Leggi l'articolo →
Database e SQL

DELETE vs TRUNCATE vs DROP in SQL: differenze, rollback e quando utilizzarli

DELETE vs TRUNCATE vs DROP spiegato con SQL testato: cosa rimuove, rollback, trigger, reimpostazione dell'identità, velocità e come differiscono Pos…

Leggi l'articolo →
Database e SQL

Spiegazione delle visualizzazioni SQL: crea, utilizza ed evita le insidie, con esempi

Viste SQL spiegate con le query che abbiamo eseguito: creazione di una vista, risultati in tempo reale, nascondere colonne, prestazioni, viste aggio…

Leggi l'articolo →
Sviluppo software

Interfaccia TypeScript e tipo: differenze reali, testate con il compilatore

Interfaccia TypeScript vs tipo, verificata con il vero compilatore: cosa possono fare entrambi, cosa può fare solo uno, fusione delle dichiarazioni,…

Leggi l'articolo →
Sviluppo software

Spiegazione di Python *args e **kwargs: funzioni flessibili con esempi chiari

Python *args e **kwargs spiegati con il codice che abbiamo eseguito: compressione e decompressione, ordine dei parametri, argomenti solo per parole …

Leggi l'articolo →
Sviluppo software

Funzioni Lambda Python: sintassi, usi reali e quando non usarli

Funzioni lambda Python spiegate con il codice che abbiamo eseguito: sintassi, ordinamento con chiave, mappa e filtro, chiusure, trap dell'associazio…

Leggi l'articolo →
Intelligenza artificiale

Cosa sono gli agenti AI? Come funzionano, con un semplice ciclo di agenti che puoi eseguire

Cosa sono gli agenti IA? Una semplice guida al ciclo dell'agente, agli strumenti, alla memoria e ai guardrail, con un piccolo ciclo Python che abbia…

Leggi l'articolo →
DevOps

Monitoraggio vs osservabilità: la vera differenza, con log, metriche e tracce

Spiegazione del monitoraggio e dell'osservabilità: errori noti e sconosciuti, log, metriche e tracce, una procedura dettagliata sugli incidenti di p…

Leggi l'articolo →
DevOps

Volumi Docker e montaggi di associazione: mantenere i dati del contenitore nel modo giusto

Volumi Docker e montaggi di collegamento spiegati: perché i dati del contenitore scompaiono, volumi denominati, montaggi di collegamento, tmpfs, ese…

Leggi l'articolo →
Automazione dei test

TDD vs BDD: differenze chiave, una caratteristica costruita in entrambi i modi e quando utilizzarli ciascuno

TDD vs BDD spiegato con una funzione di sconto costruita in entrambi i modi: refactoring rosso-verde con il codice che abbiamo eseguito, scenari "Da…

Leggi l'articolo →
Sviluppo software

Git merge vs rebase: differenze, esempi e quando usare ciascuno

Git merge vs rebase spiegato con output reale del log, una tabella di confronto, la regola d'oro del rebase e un flusso di lavoro sicuro per i team.

Leggi l'articolo →
Sviluppo software

List comprehension in Python: sintassi, esempi e quando evitarla

List comprehension in Python spiegata: sintassi, filtri, if-else, cicli annidati, tempi misurati e i casi in cui un normale ciclo for è meglio.

Leggi l'articolo →
Database e SQL

SQL JOIN spiegati con esempi (Inner, Left, Right, Full)

Capisci i JOIN SQL passo dopo passo con tabelle e query di esempio: INNER, LEFT, RIGHT, FULL, CROSS e SELF, con errori comuni e consigli sulle prest…

Leggi l'articolo →