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
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
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"] # rimuoveIterare su un dict
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?
"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".
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
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`.
Mostra suggerimento
.get('telefono', 'sconosciuto') non solleva KeyError.
Soluzione disponibile dopo 3 tentativi
Esercizio di ripasso
Dato `prices = {'mela': 1.2, 'pera': 1.5, 'kiwi': 2.0}`, calcola la somma di tutti i valori e assegnala a `total`. Valuta `total`.
Mostra suggerimento
sum(prices.values()) somma tutti i valori.
Soluzione disponibile dopo 3 tentativi
Sfida aggiuntiva
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.
Mostra suggerimento
Il metodo get accetta un secondo parametro di fallback: user.get('role', 'guest').
Soluzione disponibile dopo 3 tentativi