Introduzione ai Dizionari in Python

Dopo le liste, i dizionari sono la seconda struttura dati più importante in Python. In questa lezione inizieremo a studiare le caratteristiche principali di un dizionario.

Vedremo che un dizionario è un contenitore di elementi che associa ad ogni elemento una chiave. Questa chiave può essere di qualsiasi tipo, ad esempio un intero, una stringa o una tupla. Inoltre, un dizionario è una struttura dati mutabile e non ordinata.

Caratteristiche di un Dizionario

I dizionari sono una delle strutture dati più flessibili e potenti che il linguaggio Python mette a disposizione. Come le liste, i dizionari sono collezioni di elementi, ossia sono in grado di memorizzare elementi al proprio interno.

Tuttavia, a differenza delle liste, i dizionari non sono ordinati. Questo significa che non vi è un ordine tra gli elementi che compongono il dizionario. Gli elementi vengono acceduti per chiave e non per posizione.

Così come le liste in Python vengono usate al posto di array e vettori di altri linguaggi, così i dizionari vengono usati al posto di strutture dati come i record, tabelle hash e mappe.

Un dizionario può essere usato, infatti, al posto di strutture dati e algoritmi per la ricerca di elementi. Questo perché, come vedremo, è possibile accedere agli elementi di un dizionario in tempo costante ossia in maniera molto veloce.

Le principali proprietà di un dizionario sono:

  • Accesso per chiave:

    I dizionari sono spesso chiamati array associativi o tabelle hash in altri linguaggi di programmazione. Questo perché essi associano un insieme di valori a delle chiavi così da poter ottenere un elemento fornendo la chiave con cui era stato memorizzato.

  • I dizionari non sono ordinati:

    A differenza di una lista, gli elementi memorizzati in un dizionario non sono memorizzati secondo un ordine preciso. Per comprendere questo dettaglio conviene esaminare un esempio. Supponiamo di avere una lista, che è una collezione ordinata, in cui inseriamo tre elementi:

    lista = ['a', 'b', 'c']
    

    Essendo ordinata, la lista mantiene l'ordine, per cui volendo scorrere gli elementi con un ciclo for siamo sicuri che ogni volta l'ordine sarà sempre lo stesso:

    for elemento in lista:
        print(elemento)
    
    a
    b
    c
    

    Un dizionario non possiede questa proprietà. Ogniqualvolta proviamo a scorrere gli elementi di un dizionario l'ordine potrebbe essere diverso.

    Per intenderci, il fatto che i dizionari non siano ordinati non vuol dire affatto che non possano essere iterati, ma che l'ordine di iterazione può cambiare da un'iterazione all'altra. Ossia che l'ordine di iterazione è casuale.

    Dal momento che i dizionari non sono ordinati, essi non supportano le operazioni che presuppongono un ordine come la concatenazione e lo slicing.

  • I dizionari sono mutabili

    Come le liste, i dizionari sono mutabili. Questo significa che è possibile aggiungere, rimuovere e modificare gli elementi di un dizionario. Per cui la dimensione di un dizionario può variare durante l'esecuzione del programma.

  • I dizionari possono contenere elementi eterogenei:

    Come le liste, i dizionari possono contenere elementi di tipo diverso. Per cui è possibile memorizzare in un dizionario sia numeri, stringhe, liste, tuple, altri dizionari e così via. Inoltre, un dizionario può contenere al suo interno anche altri dizionari creando, così, dizionari innestati.

  • Le chiavi di un dizionario possono essere di un tipo qualsiasi purché immutabile:

    Le chiavi di un dizionario con cui si memorizzano gli elementi possono essere di qualsiasi tipo. Possiamo usare interi, numeri in virgola mobile oppure stringhe ad esempio. Le chiavi possono anche essere di tipo differente tra di loro. L'unico vincolo è che le chiavi devono essere immutabili. Non possiamo, ad esempio, usare una lista come chiave in quanto una lista è mutabile.

  • Le chiavi di un dizionario non possono essere duplicate:

    Dato che un array associativo è una collezione di elementi associati a delle chiavi, è ovvio che le chiavi non possono essere duplicate. Questo significa che non è possibile inserire più volte la stessa chiave in un dizionario. Se proviamo a farlo, il valore associato alla chiave verrà sovrascritto.

  • Gli elementi in un dizionario sono memorizzati per riferimento:

    Come accade per le liste, gli elementi in un dizionario sono memorizzati per riferimento. Ciò significa che, a meno che l'elemento memorizzato sia di un tipo semplice come un intero, un numero in virgola mobile o una stringa, una modifica all'elemento verrà riflessa in tutti i punti in cui è stato memorizzato. Per cui anche nel caso in cui l'elemento sia memorizzato in un dizionario.

Riassumendo:

Definizione

Dizionari

Un dizionario in linguaggio Python è una Collezione mutabile di elementi che associa ad ogni elemento una e una sola chiave.

Un dizionario non è ordinato e può essere modificato dopo la sua creazione.

Creazione di un Dizionario

Adesso che abbiamo visto le caratteristiche fondamentali di un dizionario entriamo nel vivo e vediamo come crearlo.

Fondamentalmente, per creare un dizionario esistono due modi. Il primo consiste nell'usare le parentesi graffe {} e il secondo consiste nell'usare la funzione dict().

Nel primo caso bisogna specificare, usando le parentesi graffe, la lista di chiavi e valori da assegnare al dizionario. Supponiamo, ad esempio, di voler creare un dizionario che associa ad ogni giorno della settimana il suo numero. Per fare ciò possiamo scrivere:

dizionario = {
    'lunedi': 1,
    'martedi': 2,
    'mercoledi': 3,
    'giovedi': 4,
    'venerdi': 5,
    'sabato': 6,
    'domenica': 7
}

In questo caso, le chiavi sono le stringhe che rappresentano i giorni della settimana e i valori sono gli interi che rappresentano i numeri dei giorni.

Avremmo potuto anche operare al contrario, cioè creare un dizionario che associa ogni numero del giorno della settimana al giorno stesso. Per fare ciò avremmo dovuto scrivere:

dizionario = {
    1: 'lunedi',
    2: 'martedi',
    3: 'mercoledi',
    4: 'giovedi',
    5: 'venerdi',
    6: 'sabato',
    7: 'domenica'
}

Come si può osservare, nel primo caso le chiavi sono stringhe e gli elementi interi, mentre nel secondo caso le chiavi sono interi e gli elementi sono stringhe. Ciò dimostra la flessibilità dei dizionari.

Non esiste un vincolo sul tipo degli elementi. Possiamo, infatti, creare dizionari che contengono tipi eterogenei come nel caso seguente:

dizionario = {
    1: 'test',
    2: 3.14,
    3: [1, 2, 3],
    4: 5
}

In questo caso il dizionario contiene quattro elementi: una stringa, un numero in virgola mobile, una lista ed un intero.

La stessa cosa vale per le chiavi:

dizionario = {
    'test': 1,
    3.14: 2,
    5: 4
}

In questo caso le chiavi del dizionario sono di tre tipi differenti: una stringa, un numero in virgola mobile ed un intero.

L'unico vincolo sul tipo delle chiavi è che esse devono essere immutabili. Non possiamo, ad esempio, usare una lista come chiave in quanto una lista è mutabile.

>>> dizionario = {
...     [1, 2, 3]: 1
... }
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

Il secondo modo per creare un dizionario in Python è quello di usare la funzione dict. Questa funzione accetta come argomento una lista di coppie chiave-valore. Ad esempio, per creare il dizionario che associa ad ogni giorno della settimana il suo numero possiamo scrivere:

dizionario = dict(lunedì=1, martedì=2, mercoledì=3, giovedì=4, venerdì=5, sabato=6, domenica=7)

In questo caso, le chiavi sono le stringhe che rappresentano i giorni della settimana e i valori sono gli interi che rappresentano i numeri dei giorni. Infatti, se andiamo a stampare il dizionario otteniamo:

>>> dizionario
{'lunedì': 1, 'martedì': 2, 'mercoledì': 3, 'giovedì': 4, 'venerdì': 5, 'sabato': 6, 'domenica': 7}

Il limite della funzione dict, tuttavia, è che consente di creare un dizionario solo se le chiavi sono stringhe. Se le chiavi sono di un altro tipo, ad esempio interi, otterremo un errore:

>>> dizionario = dict(1=1, 2=2, 3=3)
  File "<stdin>", line 1
    dizionario = dict(1=1, 2=2, 3=3)
                      ^^
SyntaxError: expression cannot contain assignment, perhaps you meant "=="?

Possiamo anche creare un dizionario inizialmente vuoto. Basta usare la sintassi seguente:

dizionario = {}

Ricapitolando:

Definizione

Creazione di un Dizionario

Per creare un dizionario in Python si può usare la sintassi seguente:

dizionario = {
    chiave1: valore1,
    chiave2: valore2,
    ...
    chiaveN: valoreN
}

Oppure si può usare la funzione dict purché le chiavi siano di tipo stringa:

dizionario = dict(chiave1=valore1, chiave2=valore2, ..., chiaveN=valoreN)

Per creare un dizionario vuoto si può usare la sintassi seguente:

dizionario = {}

In Sintesi

Questa lezione introduttiva rappresenta il nostro primo incontro con i dizionari in Python. In questa lezione abbiamo visto cos'è un dizionario e quali sono le sue caratteristiche fondamentali:

  • Un dizionario è una collezione di elementi che associa ad ogni elemento una chiave;
  • Le chiavi sono uniche e immutabili;
  • I valori possono essere di qualsiasi tipo;
  • I dizionari sono mutabili, nel senso che è possibile aggiungere, rimuovere e modificare gli elementi.

Inoltre, abbiamo visto come creare un dizionario in Python. In particolare, abbiamo visto due modi per creare un dizionario:

  • Usando la sintassi dei dizionari;
  • Usando la funzione dict.

Nella prossima lezione vedremo le operazioni di base che è possibile eseguire su un dizionario in Python.