Metodi per i Dizionari in Python

In questa lezione andremo ad approfondire i metodi messi a disposizione dai dizionari in Python.

Vedremo come aggiungere elementi ad un dizionario prendendoli da un altro dizionario attraverso il metodo update. Vedremo come ottenere il valore di un elemento con il metodo setdefault. Vedremo come rimuovere un elemento con il metodo pop e popitem e come rimuovere tutti gli elementi con il metodo clear.

Aggiungere elementi ad un Dizionario: metodo update

Nella lezione precedente abbiamo visto come aggiungere un elemento ad un dizionario. Basta specificare una chiave che non è attualmente presente nel dizionario e, in maniera automatica, l'elemento associato viene creato.

Torniamo all'esempio del numero di abitanti delle città italiane:

abitanti = {
    "Roma": 2873000,
    "Milano": 1356000,
    "Napoli": 967000,
    "Torino": 882000,
    "Palermo": 669000
}

Supponiamo di voler aggiungere la città di Bologna, che ha 380000 abitanti. Normalmente faremmo così:

abitanti["Bologna"] = 380000

In Python esiste anche il meotodo update per i dizionari che permette di aggiungere più elementi contemporaneamente. Questo metodo accetta come argomento un altro dizionario, che verrà usato per aggiungere elementi al dizionario corrente.

Per cui, volendo aggiungere la città di Bologna possiamo scrivere:

abitanti.update({"Bologna": 380000})

Volendo, possiamo specificare anche altre città con la stessa istruzione. Supponiamo di voler aggiungere anche Firenze, che ha 383000 abitanti, Genova, che ha 585000 abitanti, e Venezia, che ha 270000 abitanti. Possiamo scrivere:

abitanti.update({
    "Bologna": 380000,
    "Firenze": 383000,
    "Genova": 585000,
    "Venezia": 270000
})

Se andiamo a stampare il dizionario, vedremo che sono stati aggiunti tutti gli elementi:

print(abitanti)
{'Roma': 2873000, 'Milano': 1356000, 'Napoli': 967000,
 'Torino': 882000, 'Palermo': 669000, 'Bologna': 380000,
 'Firenze': 383000, 'Genova': 585000, 'Venezia': 270000}

Il metodo update può essere usato anche per modificare gli elementi esistenti. Infatti, se nel dizionario passato come argomento vi sono delle chiavi che sono già presenti nel dizionario corrente, questi elementi verranno sovrascritti.

Supponiamo di voler modificare il numero di abitanti di Roma, portandolo da 2873000 a 2875000. Possiamo scrivere:

abitanti.update({"Roma": 2875000})

Se andiamo a stampare il dizionario, vedremo che il numero di abitanti di Roma è stato modificato:

print(abitanti)
{'Roma': 2875000, 'Milano': 1356000, 'Napoli': 967000,
 'Torino': 882000, 'Palermo': 669000, 'Bologna': 380000,
 'Firenze': 383000, 'Genova': 585000, 'Venezia': 270000}
Definizione

Metodo update per i Dizionari

Il metodo update permette di aggiungere o modificare uno o più elementi in un dizionario. L'argomento del metodo è un altro dizionario. Per ogni chiave del dizionario passato come argomento viene verificata l'esistenza nel dizionario corrente. Se la chiave non è presente, viene aggiunto l'elemento associato. Se la chiave è già presente, viene sovrascritto l'elemento associato.

La sintassi è:

dizionario.update(dizionario_argomento)

Metodo update e iterabili

Il metodo update in realtà è molto più avanzato di quanto detto sopra. L'argomento di update può essere, infatti, un qualunque iterabile che possegga certe caratteristiche.

Un iterabile è un oggetto che può essere iterato o scorso. Esempi sono le liste, i dizionari e le tuple.

L'argomento di update deve essere un iterabile con una caratteristica fondamentale: ogni elemento dell'iterabile deve essere un iterabile a sua volta composto da due elementi. Questi due elementi sono la chiave e il valore da aggiungere o modificare nel dizionario corrente.

Proviamo a chiarire il tutto ritornando all'esempio delle città e dei loro abitanti. Partiamo dal dizionario base:

abitanti = {
    "Roma": 2873000,
    "Milano": 1356000,
    "Napoli": 967000,
    "Torino": 882000,
    "Palermo": 669000
}

Vogliamo aggiungere le città di Bologna e Firenze. Possiamo costruire una lista di liste formata in questo modo:

citta_da_aggiungere = [
    ["Bologna", 380000],
    ["Firenze", 383000]
]

Ora, possiamo aggiungere le città al dizionario con il metodo update:

abitanti.update(citta_da_aggiungere)

Se andiamo a stampare il dizionario, vedremo che sono state aggiunte le due città:

print(abitanti)
{'Roma': 2873000, 'Milano': 1356000, 'Napoli': 967000,
 'Torino': 882000, 'Palermo': 669000, 'Bologna': 380000,
 'Firenze': 383000}

La caratteristica dell'oggetto citta_da_aggiungere è che si tratta di un iterabile i cui elementi sono a loro volta iterabili. Ogni elemento dell'iterabile è una lista di due elementi: la prima è la chiave, la seconda è il valore.

Avremo potuto usare anche una lista di dizionari:

citta_da_aggiungere = [
    {"Bologna": 380000},
    {"Firenze": 383000}
]

Oppure una lista di tuple:

citta_da_aggiungere = [
    ("Bologna", 380000),
    ("Firenze", 383000)
]

Riassumendo:

Definizione

Argomento del metodo update

L'argomento del metodo update può essere un iterabile i cui elementi sono a loro volta iterabili. Ogni elemento dell'iterabile deve essere un iterabile a sua volta composto da due elementi: la prima è la chiave, la seconda è il valore.

La struttura dell'argomento può essere sintetizzata schematicamente in questo modo:

[
    [chiave1, valore1],
    [chiave2, valore2],
    [chiave3, valore3],
    ...
]

Ottenere il valore di un elemento: setdefault

Nella lezione precedente abbiamo visto che esiste il metodo get che ci permette di ottenere l'elemento di un dizionario data la chiave oppure un valore di default se la chiave non è presente nel dizionario.

I dizionari in Python mettono a disposizione un secondo metodo per ottenere un elemento: setdefault. Il comportamento di questo metodo è leggermente differente rispetto a get.

In pratica setdefault richiede in ingresso due argomenti: la chiave ed un valore di default. Nel caso in cui la chiave esiste, il metodo restituisce il valore associato. Nel caso in cui la chiave non esiste, il metodo aggiunge l'elemento di default al dizionario con quella chiave e lo restituisce.

In poche parole, il metodo get non modifica il dizionario mentre setdefault si.

Per comprendere meglio prendiamo un esempio. Supponiamo di avere il seguente dizionario:

dizionario = {
    'a': 1,
    'b': 2,
    'c': 3
}

Se proviamo ad usare il metodo get per ottenere una chiave inesistente, ad esempio d, otteniamo:

print(dizionario.get('d', -1))
-1

Il metodo get restituisce il valore di default -1 ma non modifica la variabile dizionario. Infatti, se proviamo a stamparla vediamo che è rimasta identica:

print(dizionario)
{'a': 1, 'b': 2, 'c': 3}

Viceversa, se usiamo il metodo setdefault otteniamo:

print(dizionario.setdefault('d', -1))
-1

E se stampiamo il dizionario vediamo che è stato modificato:

print(dizionario)
{'a': 1, 'b': 2, 'c': 3, 'd': -1}
Definizione

Metodo setdefault di un dizionario

Il metodo setdefault di un dizionario prende in ingresso due argomenti:

  • la chiave
  • il valore di default

Se la chiave esiste, il metodo restituisce il valore associato. Se la chiave non esiste, il metodo aggiunge l'elemento di default al dizionario con quella chiave e lo restituisce.

dizionario.setdefault(chiave, valore_di_default)

Rimuovere un elemento di un Dizionario: pop

Nella lezione precedente abbiamo usato l'istruzione del per eliminare un elemento di un dizionario. Tuttavia, con l'istruzione del non otteniamo il valore dell'elemento rimosso. Per farlo, dovremmo scrivere un codice del genere:

elemento = dizionario[chiave]
del dizionario[chiave]

Possiamo riassumere queste due righe di codice in un'unica istruzione con il metodo pop. Questo metodo prende in ingresso una chiave, rimuove l'elemento associato e ne restituisce il valore.

Ad esempio, supponiamo di avere il seguente dizionario:

abitanti = {
    "Roma": 2873000,
    "Milano": 1356000,
    "Napoli": 967000,
    "Torino": 882000,
    "Palermo": 669000
}

Possiamo rimuovere l'elemento associato alla chiave "Roma" con il metodo pop:

abitanti_roma = abitanti.pop("Roma")

Se andiamo a stampare il dizionario, vedremo che l'elemento associato alla chiave "Roma" è stato rimosso:

print(abitanti)
{'Milano': 1356000, 'Napoli': 967000, 'Torino': 882000, 'Palermo': 669000}

Se andiamo a stampare la variabile abitanti_roma, vedremo che contiene il valore dell'elemento rimosso:

print(abitanti_roma)
2873000

Nel caso in cui la chiave non esista, il metodo pop solleva un'eccezione di tipo KeyError. Ad esempio, se provassimo a rimuovere l'elemento associato alla chiave "Genova":

abitanti_genova = abitanti.pop("Genova")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Genova'

In tal caso, possiamo usare il metodo pop con un secondo argomento, che sarà il valore da restituire nel caso in cui la chiave non esista:

abitanti_genova = abitanti.pop("Genova", 0)
print(abitanti_genova)
0
Definizione

Metodo pop di un Dizionario

Il metodo pop di un dizionario prende in ingresso una chiave e rimuove l'elemento associato. Il metodo restituisce il valore dell'elemento rimosso.

La sintassi è la seguente:

dizionario.pop(chiave)

Nel caso in cui la chiave non esista, il metodo pop solleva un'eccezione di tipo KeyError.

Il metodo pop accetta un secondo argomento opzionale che è il valore da restituire nel caso in cui la chiave non esista.

dizionario.pop(chiave, valore_di_default)

Rimuovere un elemento di un Dizionario: popitem

Esiste un secondo metodo messo a disposizione dai dizionari in Python per rimuovere un elemento: popitem. Questo metodo non richiede nessun argomento e rimuove un elemento dal dizionario e restituisce una tupla contenente la chiave e il valore dell'elemento rimosso.

Detto questo, il metodo popitem ha un comportamento che dipende dalla versione di Python utilizzata:

  • Python 3.6 e precedenti: il metodo popitem rimuove un elemento a caso dal dizionario.
  • Python 3.7 e successive: il metodo popitem rimuove l'ultimo elemento inserito nel dizionario.

Ora, la versione 3.6 di Python è abbastanza vecchia e obsoleta, quindi è raro che possiamo incontrarla in produzione. Tuttavia, è bene ricordare questo dettaglio.

In ogni caso, da ora in poi presupponiamo sempre che stiamo usando Python 3.7 o successive.

Prendiamo un esempio:

dizionario = {
    'a': 1,
    'b': 2,
    'c': 3
}

Possiamo rimuovere l'ultimo elemento inserito, in questo caso c, con il metodo popitem:

elemento = dizionario.popitem()
print(elemento)
('c', 3)

Adesso inseriamo un nuovo elemento:

dizionario['d'] = 4

Proviamo a invocare di nuovo il metodo popitem:

elemento = dizionario.popitem()
print(elemento)
('d', 4)

Come possiamo vedere, il metodo popitem rimuove sempre l'ultimo elemento inserito nel dizionario.

Nel caso in cui il dizionario sia vuoto e proviamo a invocare il metodo popitem, il metodo solleverà un'eccezione di tipo KeyError:

dizionario = {}
elemento = dizionario.popitem()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'popitem(): dictionary is empty'
Definizione

Metodo popitem di un Dizionario

Il metodo popitem rimuove l'ultimo elemento inserito nel dizionario e restituisce una tupla contenente la chiave e il valore dell'elemento rimosso.

Il metodo non richiede nessun argomento e la sua sintassi è la seguente:

dizionario.popitem()

Per le versioni di Python precedenti alla 3.7, il metodo popitem rimuove un elemento a caso dal dizionario.

Rimuovere tutti gli elementi di un Dizionario: clear

L'ultimo metodo che vedremo in questa lezione è il metodo clear. Questo metodo permette di rimuovere tutti gli elementi di un dizionario. Questo metodo non prende in ingresso argomenti e non restituisce alcun valore.

Supponiamo di avere il seguente dizionario:

abitanti = {
    "Roma": 2873000,
    "Milano": 1356000,
    "Napoli": 967000,
    "Torino": 882000,
    "Palermo": 669000
}

Possiamo rimuovere tutti gli elementi del dizionario con il metodo clear:

abitanti.clear()

Se andiamo a stampare il dizionario, vedremo che è vuoto:

print(abitanti)
{}
Definizione

Metodo clear per i Dizionari

Il metodo clear permette di rimuovere tutti gli elementi di un dizionario. Questo metodo non prende in ingresso argomenti e non restituisce alcun valore.

La sintassi è:

dizionario.clear()

In Sintesi

In questa lezione abbiamo studiato i principali metodi che un dizionario mette a disposizione in Python. Attraverso di essi è possibile effettuare operazioni molto più specifiche rispetto alle operazioni viste nella lezione precedente.

  • Abbiamo visto che usando il metodo update è possibile inserire o modificare uno o più elementi di un dizionario in una modalità bulk, ossia attraverso un'unica istruzione;
  • Abbiamo visto che usando il metodo setdefault è possibile ottenere il valore di un elemento di un dizionario e, nel caso in cui la chiave non esista, aggiungere un elemento con quella chiave;
  • Abbiamo visto che usando il metodo pop è possibile rimuovere un elemento di un dizionario e ottenere il valore di quell'elemento;
  • Abbiamo visto che usando il metodo popitem è possibile rimuovere l'ultimo elemento inserito in un dizionario e ottenere il valore di quell'elemento;
  • Infine, abbiamo visto che usando il metodo clear è possibile rimuovere tutti gli elementi di un dizionario.

Questi metodi aggiungono nuovi modi di lavorare con i dizionari che possono tornare utili in determinate situazioni.