2.7. Introduzione ai dizionari

Una piccola digressione è dovuta perché avete bisogno di conoscere dizionari, tuple e liste. Se siete dei programmatori esperti in Perl, probabilmente ne sapete abbastanza sui dizionari e sulle liste, ma dovreste comunque prestare attenzione alle tuple.

Uno dei tipi predefiniti in Python è il dizionario che definisce una relazione uno-a-uno tra chiavi e valori.

Nota
Un dizionario in Python è come una hash in Perl. In Perl, le variabili che memorizzano degli hash cominciano sempre con il carattere %; in Python, le variabili possono avere qualsiasi nome, e Python tiene traccia del loro tipo internamente.
Nota
Un dizionario in Python è come l'istanza di una classe Hashtable in Java.
Nota
Un dizionario Python è come l'istanza di un oggetto Scripting.Dictionary in Visual Basic.

Esempio 2.10. Definire un dizionario

>>> d = {"server":"mpilgrim", "database":"master"} 1
>>> d
{'server': 'mpilgrim', 'database': 'master'}
>>> d["server"]                                    2
'mpilgrim'
>>> d["database"]                                  3
'master'
>>> d["mpilgrim"]                                  4
Traceback (innermost last):
  File "<interactive input>", line 1, in ?
KeyError: mpilgrim
1 Per prima cosa, creiamo un nuovo dizionario con due elementi e lo assegnamo alla variabile d. Ogni elemento è una coppia chiave-valore, e l'intero insieme di elementi è racchiuso tra parentesi graffe.
2 'server' è una chiave ed il suo valore associato, referenziato da d["server"] è 'mpilgrim'.
3 'database' è una chiave ed il suo valore associato, referenziato da d["database"] è 'master'.
4 Potete ottenere i valori dalle chiavi, ma non potete ottenere le chiavi dai valori. Così, d["server"] è 'mpilgrim', ma d["mpilgrim"] genera un'eccezione perché 'mpilgrim' non è una chiave.

Esempio 2.11. Modificare un dizionario

>>> d
{'server': 'mpilgrim', 'database': 'master'}
>>> d["database"] = "pubs" 1
>>> d
{'server': 'mpilgrim', 'database': 'pubs'}
>>> d["uid"] = "sa"        2
>>> d
{'server': 'mpilgrim', 'uid': 'sa', 'database': 'pubs'}
1 Non possono esserci duplicazioni di chiavi in un dizionario. Assegnare un valore ad una chiave esistente sovrascriverà il vecchio valore.
2 Potete aggiungere nuove coppie chiave-valore in ogni momento. È la stessa sintassi della modifica di valori già esistenti. (Sì, questo vi disturberà, a volte, quando pensate di aggiungere nuovi valori mentre state in realtà semplicemente modificando lo stesso valore più e più volte solo perché la chiave non sta cambiando come pensavate.)

Notate che il nuovo elemento (chiave 'uid', valore 'sa') sembra trovarsi nel mezzo. Infatti è una semplice coincidenza che gli elementi appaiano ordinati nel primo esempio; è comunque una coincidenza anche il fatto che ora appaiano disordinati.

Nota
I dizionari non hanno il concetto di ordinamento tra elementi. È errato dire che gli elementi sono “disordinati”; sono semplicemente non ordinati. Si tratta di un'importante distinzione che vi darà noia quando vorrete accedere agli elementi di un dizionario in un ordine specifico e ripetibile (ad esempio in ordine alfabetico di chiave). Ci sono dei modi per farlo, semplicemente non sono predefiniti nel dizionario.

Esempio 2.12. Mischiare tipi di dato in un dizionario

>>> d
{'server': 'mpilgrim', 'uid': 'sa', 'database': 'pubs'}
>>> d["retrycount"] = 3 1
>>> d
{'server': 'mpilgrim', 'uid': 'sa', 'database': 'master', 'retrycount': 3}
>>> d[42] = "douglas"   2
>>> d
{'server': 'mpilgrim', 'uid': 'sa', 'database': 'master', 42: 'douglas', 'retrycount': 3}
1 I dizionari non funzionano solo con le stringhe. I valori dei dizionari possono essere di qualunque tipo, incluse stringhe, interi, oggetti ed anche altri dizionari. All'interno di un singolo dizionario i valori non devono tutti essere dello stesso tipo, potete mischiarli secondo l'occorrenza.
2 Le chiavi dei dizionari sono molto più ristrette, ma possono essere stringhe, interi ed alcuni altri tipi (se ne parlerà diffusamente più avanti). Anche i tipi delle chiavi possono essere mischiati in un dizionario.

Esempio 2.13. Cancellare elementi da un dizionario

>>> d
{'server': 'mpilgrim', 'uid': 'sa', 'database': 'master', 42: 'douglas', 'retrycount': 3}
>>> del d[42] 1
>>> d
{'server': 'mpilgrim', 'uid': 'sa', 'database': 'master', 'retrycount': 3}
>>> d.clear() 2
>>> d
{}
1 del vi permette di cancellare singoli elementi da un dizionario in base alla chiave.
2 clear cancella tutti gli elementi da un dizionario. Notate che le parentesi graffe vuote indicano un dizionario privo di elementi.

Esempio 2.14. Le stringhe sono case-sensitive

>>> d = {}
>>> d["key"] = "value"
>>> d["key"] = "other value" 1
>>> d
{'key': 'other value'}
>>> d["Key"] = "third value" 2
>>> d
{'Key': 'third value', 'key': 'other value'}
1 Assegnare un valore ad una chiave già esistente in un dizionario semplicemente sostituisce un vecchio valore con uno nuovo.
2 Questo non significa assegnare un valore ad una chiave già esistente perché le stringhe in Python sono case-sensitive, così 'key' non è la stessa cosa di 'Key'. Si crea una nuova coppia chiave/valore nel dizionario; potrebbe sembrarvi simile, ma per come è stato progettato Python è completamente diverso.

Ulteriori letture