W3docs

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
city

Chiamare .keys() è equivalente e rende l'intenzione più esplicita:

python— editable, runs on the server

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 -> Berlin

Quando 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
95

Un 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.3

Iterare 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: Berlin

Filtrare 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: 3

Ordinare 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: 12

Ordinare 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: 3

Usare 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 -> #0000FF

Comprehension 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=91

Modificare 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

ObiettivoMetodo
Iterare solo sulle chiavifor key in d oppure for key in d.keys()
Iterare solo sui valorifor value in d.values()
Iterare su entrambifor key, value in d.items()
Costruire un nuovo dizionarioComprehension di dizionari
Ordinare le vocisorted(d) oppure sorted(d.items(), key=...)
Indice + coppia chiave-valoreenumerate(d.items())

Per l'insieme completo delle operazioni sui dizionari, consulta Python Dictionary Methods e Copy Dictionaries.

Esercitati

Pratica
Which of the following ways can be used to loop through a dictionary in Python, as learned from the webpage at W3docs?
Which of the following ways can be used to loop through a dictionary in Python, as learned from the webpage at W3docs?
Was this page helpful?