2.9. Dizionari

Un dizionario è una mappatura da chiavi a valori. Ogni chiave viene cercata direttamente; il dizionario ricorda quale valore è stato associato per ultimo a quella chiave.

2.9.1. Creare dizionari

Usa le parentesi graffe con coppie key: value, oppure il costruttore dict:

empty   = {}
person  = {"name": "OpenMV", "id": 42}
counts  = dict(a=1, b=2, c=3)            # keyword form
pairs   = dict([("x", 1), ("y", 2)])     # from a list of pairs

I valori possono essere di qualsiasi tipo – stringhe, numeri, liste, persino altri dict:

config = {
    "name":  "OpenMV",
    "id":    42,
    "width": 320,
    "tags":  ["red", "round"],
}
Un dizionario mostrato come due colonne: le chiavi a sinistra, i valori a destra, con frecce che collegano ogni coppia.

Ogni chiave in un dizionario mappa esattamente a un valore.

2.9.2. Accesso e appartenenza

L’indicizzazione con [] recupera il valore associato a una chiave. Una chiave mancante solleva KeyError:

>>> person = {"name": "OpenMV", "id": 42}
>>> person["name"]
'OpenMV'
>>> person["missing"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'missing'

Per una ricerca tollerante, usa dict.get(). Restituisce None per una chiave mancante, oppure un valore che passi come secondo argomento:

>>> person.get("name")
'OpenMV'
>>> person.get("missing")            # returns None
>>> person.get("missing", "n/a")
'n/a'

La parola chiave in verifica l’appartenenza di una chiave – non di un valore:

>>> "name" in person
True
>>> "OpenMV" in person
False

2.9.3. Aggiungere, aggiornare e rimuovere

Assegnare a d[key] aggiunge la voce se la chiave è nuova e la sovrascrive se esiste già:

>>> person["seen"] = 1
>>> person["seen"] = 2               # overwrites
>>> person
{'name': 'OpenMV', 'id': 42, 'seen': 2}

La rimozione ha diverse forme:

  • del d[key] – rimuove una voce; solleva KeyError se la chiave è mancante.

  • dict.pop() – rimuove e restituisce il valore; un valore predefinito opzionale permette di evitare l’eccezione.

  • dict.clear() – rimuove tutte le voci.

dict.update() unisce un altro dizionario (o una lista di coppie (key, value)) in quello ricevente, sovrascrivendo eventuali chiavi corrispondenti:

>>> person.update({"id": 100, "owner": "alice"})
>>> person
{'name': 'OpenMV', 'id': 100, 'seen': 2, 'owner': 'alice'}

2.9.4. Iterare

Iterare direttamente un dizionario produce le sue chiavi, nell’ordine di inserimento:

for k in person:
    print(k)

Tre viste forniscono un accesso esplicito:

for key, value in person.items():
    print(key, "=", value)

2.9.5. Cosa può essere una chiave

Le chiavi di un dizionario devono essere hashable – il loro valore non può cambiare durante la loro esistenza. I tipi hashable comuni sono:

I tipi mutabili come list, dict e bytearray non possono essere chiavi; usarne uno solleva TypeError. Le tuple di valori immutabili sono il modo standard per indicizzare un dizionario tramite un identificatore composito, come una coordinata di griglia 2D:

>>> grid = {}
>>> grid[(0, 0)] = "start"
>>> grid[(5, 7)] = "end"

2.9.6. Lunghezza

len() restituisce il numero di voci:

>>> len(person)
4