Iterare sui Dizionari
Impara tutti i modi per iterare su un dizionario Python: chiavi, valori, items, filtri, comprehension e modifiche sicure durante l'iterazione.
I dizionari Python memorizzano i dati come coppie chiave-valore, e spesso avrai bisogno di scorrerli — per stampare ogni voce, filtrare i dati, trasformare i valori o costruire nuove strutture. Questo capitolo illustra ogni tecnica standard per iterare su un dizionario, spiega quale metodo utilizzare in ogni situazione e mette in evidenza l'errore più comune: modificare un dizionario mentre si sta iterando su di esso.
Se non conosci i dizionari, leggi prima Python Dictionaries. Per la sintassi generale dei cicli, consulta Python For Loops.
Iterare sulle Chiavi
Quando usi un semplice ciclo for su un dizionario, Python itera sulle sue chiavi per impostazione predefinita.
Iteriamo sulle chiavi del dizionario
person = {"name": "Alice", "age": 30, "city": "Berlin"}
for key in person:
print(key)Output:
name
age
cityChiamare .keys() è equivalente e rende l'intenzione più esplicita:
Una volta ottenuta la chiave, puoi cercarne il valore all'interno del ciclo:
person = {"name": "Alice", "age": 30, "city": "Berlin"}
for key in person:
print(key, "->", person[key])Output:
name -> Alice
age -> 30
city -> BerlinQuando usare .keys()
Usa la forma semplice for key in d quando hai bisogno solo delle chiavi. Usa d.keys() esplicitamente quando vuoi verificare l'appartenenza ("name" in d.keys()) o passare la vista a un'altra funzione. Per un semplice test di appartenenza, però, if "name" in d è più veloce.
Iterare sui Valori
Usa .values() quando hai bisogno solo dei valori e non ti interessano le chiavi.
Iteriamo sui valori del dizionario
scores = {"math": 92, "science": 87, "english": 95}
for score in scores.values():
print(score)Output:
92
87
95Un caso d'uso comune è calcolare un riepilogo su tutti i valori:
scores = {"math": 92, "science": 87, "english": 95}
total = sum(scores.values())
average = total / len(scores)
print(f"Average score: {average:.1f}")Output:
Average score: 91.3Iterare sulle Coppie Chiave-Valore con .items()
.items() restituisce ogni voce come una tupla (key, value). Puoi decomprimere la tupla direttamente in due variabili. Questo è il metodo di iterazione più versatile e quello che userai più spesso.
Iteriamo sulle coppie chiave-valore
person = {"name": "Alice", "age": 30, "city": "Berlin"}
for key, value in person.items():
print(f"{key}: {value}")Output:
name: Alice
age: 30
city: BerlinFiltrare Durante l'Iterazione
Combina un ciclo for con una condizione if per elaborare solo le voci che ti interessano.
Stampare solo gli articoli disponibili in magazzino
inventory = {"apples": 5, "bananas": 0, "oranges": 3, "grapes": 0}
print("In stock:")
for item, qty in inventory.items():
if qty > 0:
print(f" {item}: {qty}")Output:
In stock:
apples: 5
oranges: 3Ordinare le Voci del Dizionario
Python 3.7+ garantisce che i dizionari mantengano l'ordine di inserimento. Se hai bisogno di un ordine diverso, ordina le chiavi o le voci prima di iterare — il dizionario stesso non viene modificato.
Ordinare per chiave (alfabeticamente)
book = {"banana": 7, "apple": 3, "cherry": 12}
for fruit in sorted(book):
print(f"{fruit}: {book[fruit]}")Output:
apple: 3
banana: 7
cherry: 12Ordinare per valore
Passa una funzione key a sorted() per controllare il criterio di ordinamento.
book = {"banana": 7, "apple": 3, "cherry": 12}
for fruit, count in sorted(book.items(), key=lambda item: item[1], reverse=True):
print(f"{fruit}: {count}")Output:
cherry: 12
banana: 7
apple: 3Usare enumerate() Durante l'Iterazione
Avvolgi .items() in enumerate() per ottenere un indice progressivo insieme a ogni coppia chiave-valore.
colors = {"red": "#FF0000", "green": "#00FF00", "blue": "#0000FF"}
for index, (name, hex_code) in enumerate(colors.items()):
print(f"{index}: {name} -> {hex_code}")Output:
0: red -> #FF0000
1: green -> #00FF00
2: blue -> #0000FFComprehension di Dizionari
Una comprehension di dizionari costruisce un nuovo dizionario da uno esistente in una singola espressione. La sintassi rispecchia le list comprehension, ma utilizza le parentesi graffe e i due punti tra chiave e valore.
Applicare uno sconto del 10% a ogni prezzo
prices = {"apple": 1.20, "banana": 0.50, "orange": 0.80}
discounted = {item: round(price * 0.9, 2) for item, price in prices.items()}
print(discounted)Output:
{'apple': 1.08, 'banana': 0.45, 'orange': 0.72}Puoi aggiungere una condizione di filtro alla fine:
Mantenere solo gli studenti con punteggio pari o superiore a 90
students = {
"Alice": {"grade": "A", "score": 95},
"Bob": {"grade": "B", "score": 82},
"Carol": {"grade": "A", "score": 91},
}
top_students = {name: info for name, info in students.items() if info["score"] >= 90}
print(top_students)Output:
{'Alice': {'grade': 'A', 'score': 95}, 'Carol': {'grade': 'A', 'score': 91}}Iterare su Dizionari Annidati
Quando i valori sono a loro volta dizionari (vedi Nested Dictionaries), accedi alle voci interne con un secondo indice o un secondo ciclo.
Stampare tutti i campi per ogni studente
students = {
"Alice": {"grade": "A", "score": 95},
"Bob": {"grade": "B", "score": 82},
"Carol": {"grade": "A", "score": 91},
}
for name, info in students.items():
print(f"{name}: grade={info['grade']}, score={info['score']}")Output:
Alice: grade=A, score=95
Bob: grade=B, score=82
Carol: grade=A, score=91Modificare un Dizionario Durante l'Iterazione — l'Insidia Principale
Non puoi aggiungere o rimuovere chiavi da un dizionario mentre stai iterando su di esso. Python genera immediatamente un RuntimeError:
d = {"a": 1, "b": 2, "c": 3}
# This raises RuntimeError: dictionary changed size during iteration
for key in d:
if d[key] == 2:
del d[key]Il pattern sicuro consiste nel raccogliere prima le chiavi da rimuovere, poi eliminarle dopo il ciclo:
Eliminazione sicura dopo l'iterazione
config = {"debug": True, "verbose": True, "timeout": 30}
keys_to_remove = [k for k, v in config.items() if v is True]
for k in keys_to_remove:
del config[k]
print(config)Output:
{'timeout': 30}Lo stesso principio vale per l'aggiunta di chiavi: raccogli le nuove coppie, poi aggiorna il dizionario con update() o un'assegnazione diretta dopo il ciclo.
Scegliere il Metodo Giusto
| Obiettivo | Metodo |
|---|---|
| Iterare solo sulle chiavi | for key in d oppure for key in d.keys() |
| Iterare solo sui valori | for value in d.values() |
| Iterare su entrambi | for key, value in d.items() |
| Costruire un nuovo dizionario | Comprehension di dizionari |
| Ordinare le voci | sorted(d) oppure sorted(d.items(), key=...) |
| Indice + coppia chiave-valore | enumerate(d.items()) |
Per l'insieme completo delle operazioni sui dizionari, consulta Python Dictionary Methods e Copy Dictionaries.