Un dizionario è una tabella di ricerca
Le liste sono indicizzate per posizione. I dizionari sono indicizzati per chiave, di solito una stringa o un numero, e ogni chiave corrisponde a un valore. Questo solo cambiamento apre un'enorme categoria di programmi: inventari, configurazioni, payload JSON, profili utente, cache.
Chiavi e valori possono essere quasi qualsiasi cosa. Le chiavi devono essere hashable (quindi numeri, stringhe, tuple; non liste o altri dict). I valori non hanno restrizioni: un dict può contenere qualsiasi cosa, compresi altri dict o liste.
Creare dizionari
Ci sono diversi modi, ognuno con il suo momento:
Leggere i valori
Due modi, e la scelta conta:
Scegli in base all'intenzione:
- Usa
[]quando la chiave deve esserci. Se non c'è, è un bug e vuoi un errore bene in vista. - Usa
.get()quando "non presente" è un caso valido. Ti permette di scrivere valori predefiniti senza try/except.
Aggiungere, aggiornare, cancellare
Assegnare un valore a una chiave la crea o la aggiorna:
update() unisce un altro dict o un iterabile di coppie:
Le chiavi in comune in overrides sovrascrivono quelle in settings.
Verificare se esiste una chiave
in controlla le chiavi, non i valori:
Per controllare proprio i valori, usa user.values():
Come scorrere un dizionario
Hai tre viste su cui fare un ciclo:
.items() è quello che userai la maggior parte delle volte: ti dà la coppia, già spacchettata e pronta all'uso.
Nel Python moderno (3.7+) l'ordine di iterazione corrisponde all'ordine di inserimento. Un dict non è un "sacco magico": se aggiungi a, poi b, poi c, l'iterazione li restituisce in quell'ordine. È una garanzia del linguaggio su cui puoi contare.
Come ordinare un dizionario
I dizionari conservano l'ordine di inserimento, quindi "ordinare" un dict significa in realtà costruirne uno nuovo le cui chiavi vengono inserite nell'ordine che vuoi:
sorted() restituisce una lista di coppie; avvolgerla in dict(...) ricostruisce un dizionario con il nuovo ordine. Se ti servono solo le coppie ordinate (non un dict), salta la chiamata esterna a dict().
Come unire due dizionari
Python 3.9+ ti offre l'operatore |:
Se una chiave compare in entrambi, vince il valore del dict a destra. .update() è l'equivalente che modifica sul posto. Nelle versioni più vecchie di Python, usa {**defaults, **overrides}.
Lo schema setdefault
Un'esigenza comune: "se la chiave c'è, usa il suo valore; se no, imposta un valore predefinito e poi usalo".
Oppure, meglio ancora, usa collections.Counter:
Counter è una sottoclasse di dict che fa i conteggi in automatico. È la scelta giusta ogni volta che conti delle occorrenze.
Dict comprehension
Come le list comprehension, ma per costruire dict:
Stesse regole delle list comprehension, ma con key: value tra le parentesi graffe.
Il dict, gemello del JSON
I dict di Python corrispondono quasi perfettamente agli oggetti JSON. Convertire dall'uno all'altro richiede una sola chiamata:
Ecco perché i dict compaiono ovunque nello sviluppo web: le tue richieste e risposte API sono in pratica manipolazione di dict con un po' di rete in mezzo.
Un esempio pratico
Un piccolo programma in stile configurazione che gestisce un profilo utente:
Dict annidati, valori modificabili, .get() con un valore predefinito: la cassetta degli attrezzi di base per qualsiasi dato a forma di record.
Andiamo avanti
Liste, tuple, set, dict. Con queste quattro collezioni in mano puoi modellare quasi tutti i dati che incontrerai all'inizio. Nel prossimo argomento vedremo la list comprehension, il modo compatto di Python per trasformare una collezione in un'altra.
Domande frequenti
Cos'è un dizionario in Python?
Un dizionario è una collezione di coppie chiave-valore. Cerchi un valore tramite la sua chiave: prices['apple'] invece di prices[0]. I dizionari sono veloci da leggere e scrivere, le chiavi devono essere uniche e nel Python moderno conservano l'ordine in cui hai inserito gli elementi.
Come aggiungo una chiave a un dizionario Python?
Assegnale un valore: my_dict['new_key'] = 'new value'. Se la chiave esiste già, il valore viene sovrascritto. Se non esiste, viene aggiunta. Non c'è distinzione tra "inserire" e "aggiornare": la sintassi è la stessa.
Qual è la differenza tra dict[key] e dict.get(key)?
dict[key] solleva KeyError se la chiave non c'è. dict.get(key) invece restituisce None (o un valore predefinito che fornisci tu). Usa .get() quando le chiavi mancanti sono previste e normali; usa [key] quando una chiave mancante è un bug.