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.
- Lo schema è
[espressione for elemento in iterabile if condizione]. - Un semplice
ifalla fine filtra; unif-elseall’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 ciclo | 3,62 ms |
| Filtrare i pari con una comprehension | 3,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)
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.
Altre guide su test, intelligenza artificiale e sviluppo moderno
Ti è piaciuto questo articolo? Scegli un argomento e passa direttamente ai nostri tutorial più recenti.
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 →DevOpsSpiegazione 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 softwareSpiegazione 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 testDerisione 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 softwareSpiegazione 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 SQLDELETE 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 SQLSpiegazione 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 softwareInterfaccia 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 softwareSpiegazione 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 softwareFunzioni 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 artificialeCosa 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 →DevOpsMonitoraggio 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 →DevOpsVolumi 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 testTDD 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 softwareGit 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 softwareList 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 SQLSQL 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 →