Vai al contenuto
eLearner.app
Modulo 3 · Lezione 3 di 411/36 nel corso~12 min
Lezioni del modulo (3/4)

Dizionari

Un dizionario (dict) è una mappa chiave → valore: associ una chiave (quasi sempre una stringa) a un valore di qualunque tipo. È la struttura dati fondamentale per modellare entità del mondo reale.

Creare un dizionario

Python
vuoto = {}
utente = {"nome": "Ada", "anni": 36, "attivo": True}
# costruttore alternativo
utente = dict(nome="Ada", anni=36, attivo=True)

Le chiavi devono essere hashable (immutabili): stringhe, numeri, tuple di elementi hashable. I valori invece possono essere qualunque cosa, anche altri dict.

Accesso, modifica, cancellazione

Python
utente["nome"]            # 'Ada'
utente["email"]           # KeyError!
utente.get("email")       # None       (default sicuro)
utente.get("email", "—")  # '—'        (default custom)
utente["citta"] = "Roma"  # aggiunge / aggiorna
del utente["attivo"]      # rimuove

Iterare su un dict

Python
for chiave in utente:               # itera sulle CHIAVI (default)
    print(chiave, utente[chiave])

for chiave in utente.keys():        # esplicito
    ...

for valore in utente.values():
    print(valore)

for chiave, valore in utente.items():    # idiom più comune
    print(f"{chiave} = {valore}")

L'ordine di iterazione è quello di inserimento (garantito da Python 3.7 in poi).

Esiste la chiave?

Python
"nome" in utente     # True
"email" in utente    # False     (NON usa il valore, usa la chiave!)

setdefault: inizializzare al primo accesso

Pattern frequente: "se la chiave non esiste, mettici il default; ritorna in ogni caso il valore corrente".

Python
gruppi = {}
for nome in ["Ada", "Linus", "Ada", "Grace", "Linus", "Ada"]:
    gruppi.setdefault(nome, []).append(1)
# {'Ada': [1, 1, 1], 'Linus': [1, 1], 'Grace': [1]}

Esiste anche collections.Counter per il caso specifico del conteggio (lo vediamo nel modulo stdlib).

Iterare sui dizionari

Puoi iterare su un dizionario in diversi modi:

  • for k in d: itera solo sulle chiavi (comportamento di default).
  • for k, v in d.items(): itera contemporaneamente su coppie chiave-valore (molto utile).
  • for v in d.values(): itera solo sui valori.

Prova tu

Esercizio#python.m3.l3.e1
Tentativi: 0Caricamento…

Dato `user = {'nome': 'Ada', 'anni': 36}`, aggiungi la chiave 'email' = 'ada@ex.com' e poi assegna a `email_or_default` il valore della chiave 'telefono' usando .get con default 'sconosciuto'. Valuta `email_or_default`.

Caricamento editor…
Mostra suggerimento

.get('telefono', 'sconosciuto') non solleva KeyError.

Soluzione disponibile dopo 3 tentativi

Esercizio di ripasso

Esercizio#python.m3.l3.e2
Tentativi: 0Caricamento…

Dato `prices = {'mela': 1.2, 'pera': 1.5, 'kiwi': 2.0}`, calcola la somma di tutti i valori e assegnala a `total`. Valuta `total`.

Caricamento editor…
Mostra suggerimento

sum(prices.values()) somma tutti i valori.

Soluzione disponibile dopo 3 tentativi

Sfida aggiuntiva

Esercizio#python.m3.l3.e3
Tentativi: 0Caricamento…

Dato il dizionario `user = {'name': 'Alice'}`, usa il metodo `.get()` per recuperare il valore della chiave `'role'`. Se la chiave non esiste, fai in modo che restituisca il valore di default `'guest'`. Salva il risultato in `user_role` e valutalo.

Caricamento editor…
Mostra suggerimento

Il metodo get accetta un secondo parametro di fallback: user.get('role', 'guest').

Soluzione disponibile dopo 3 tentativi