edubun
Italiano

Dizionari

Cercare una chiave che non è in un dizionario ferma il programma con KeyError, ma d.get(key, 0) restituisce invece 0.

Seoyeon ha 12 schede e tre candidati

ContestoSeoyeon (una studentessa inventata) sta contando i voti per il rappresentante di classe. Si candidano tre compagni: Ari, Bo e Cy. Dodici schede piegate stanno in una scatola. Su carta scriverebbe i tre nomi lungo il lato di un foglio e metterebbe un segno accanto a un nome ogni volta che apre una scheda. Vuole fare lo stesso in Python, e scopre subito che una lista è scomoda per questo. Con una lista dovrebbe ricordare che la posizione 0 è Ari e la posizione 1 è Bo. Quello che vuole è una tabella che vada direttamente da un nome a un numero.

Quella tabella è un dizionario. Un dizionario memorizza coppie: una chiave, e il valore che le corrisponde. Lo scrivi tra parentesi graffe, con i due punti tra ogni chiave e il suo valore. Per leggere un valore, metti la chiave tra parentesi quadre, come metteresti un indice dopo una lista. Per aggiungere una coppia o cambiarne una, assegna a quella chiave.

votes = {"Ari": 0, "Bo": 0, "Cy": 0}
votes["Bo"] = votes["Bo"] + 1
votes["Ari"] += 1
votes["Bo"] += 1
print(votes)
print(votes["Bo"])
Output
{'Ari': 1, 'Bo': 2, 'Cy': 0}
2
Un dizionario associa ogni chiave a un valore. votes["Bo"] va direttamente a 5 senza contare le posizioni.

Contare l'intera scatola in un ciclo

Scrivere una riga per ogni scheda non è meglio dei segni sulla carta. Seoyeon mette le schede in una lista e la scorre con un ciclo. C'è un intoppo: e se una scheda nomina qualcuno che non aveva preparato in anticipo, o se preferisce non elencare prima i candidati? Leggere una chiave mancante con le parentesi quadre ferma il programma. Il metodo get(key, default) risolve il problema. Restituisce il valore se la chiave c'è e il valore predefinito se non c'è, quindi votes.get(name, 0) + 1 funziona per il primo voto e per ogni voto successivo.

ballots = ["Bo", "Ari", "Bo", "Cy", "Bo", "Ari",
           "Cy", "Bo", "Ari", "Bo", "Cy", "Bo"]
votes = {}
for name in ballots:
    votes[name] = votes.get(name, 0) + 1
print(votes)
print(len(ballots), sum(votes.values()))
Output
{'Bo': 6, 'Ari': 3, 'Cy': 3}
12 12

L'ultima riga è il controllo di Seoyeon. Dodici schede sono entrate, e i conteggi sommano dodici, quindi non se n'è perduta nessuna. Nota l'ordine dei nomi nell'output: Bo per primo, perché Bo è stato il primo nome incontrato dal ciclo. Da Python 3.7, un dizionario mantiene le sue chiavi nell'ordine in cui sono state aggiunte la prima volta, e lo dice anche la sezione del tutorial sui dizionari.

Scorrere insieme chiavi e valori

Un ciclo for su un dizionario dà le chiavi. items() dà insieme chiave e valore, ed è ciò che vuoi per una tabella dei risultati. in controlla se una chiave esiste, e max() con key=votes.get trova la chiave con il valore più grande. Quest'ultimo è uno schema che vale la pena di copiare così com'è, ancora prima che ogni sua parte abbia senso.

votes = {"Bo": 6, "Ari": 3, "Cy": 3}
for name, n in votes.items():
    print(name, "#" * n, n)
print("Dan" in votes)
print(max(votes, key=votes.get))
Output
Bo ###### 6
Ari ### 3
Cy ### 3
False
Bo

I dizionari compaiono ovunque i dati arrivino in coppie nome e valore: una parola e il suo significato, una stazione della metropolitana e il numero della sua linea, un numero di matricola e un nome. Le chiavi devono essere uniche, e assegnare a una chiave esistente ne sostituisce il vecchio valore invece di aggiungere una seconda copia.

dizionarioCoppie chiave: valore in { }
chiaveIl nome con cui cerchi un valore; le chiavi sono uniche
d[key]Legge il valore; KeyError se la chiave manca
d.get(key, default)Legge il valore, o dà il valore predefinito se la chiave manca
d.items()Coppie chiave e valore per un ciclo for
key in dTrue se il dizionario ha quella chiave
  1. Cosa stampa questo codice?
    price = {"gimbap": 3500, "ramen": 4500}
    print(price["ramen"])
  2. Cosa stampa questo codice?
    price = {"gimbap": 3500}
    price["tteokbokki"] = 5000
    print(len(price))
  3. Cosa stampa questo codice?
    price = {"gimbap": 3500}
    price["gimbap"] = 4000
    print(price)
  4. Cosa stampa questo codice?
    stock = {"pens": 4}
    print(stock.get("pens", 0), stock.get("tape", 0))
  5. Cosa succede quando questo codice viene eseguito?
    stock = {"pens": 4}
    print(stock["tape"])
    • Stampa 0
    • Stampa None
    • Stampa tape
    • Si ferma con KeyError: 'tape'
  6. Cosa stampa questo codice?
    counts = {}
    for ch in "hello":
        counts[ch] = counts.get(ch, 0) + 1
    print(counts["l"])
  7. Cosa stampa questo codice?
    ages = {"Mina": 14, "Jun": 13}
    print("Jun" in ages, 14 in ages)
  8. Cosa stampa questo codice?
    d = {"b": 2, "a": 1}
    for k in d:
        print(k)
    • a
      b
    • b
      a
    • 2
      1
    • b 2
      a 1
  9. Cosa stampa questo codice?
    scores = {"Ari": 3, "Bo": 6, "Cy": 3}
    print(max(scores, key=scores.get))
  10. Cosa stampa questo codice?
    d = {"x": 1, "y": 2}
    total = 0
    for k, v in d.items():
        total += v
    print(total)
Errori comuni
  • «votes["Dan"] dà 0 se Dan non ha ricevuto voti.» Se "Dan" non è mai stato aggiunto come chiave, la ricerca si ferma con KeyError: 'Dan'. Usa votes.get("Dan", 0) quando una chiave può mancare.
  • «14 in ages controlla se qualcuno ha 14 anni.» in guarda le chiavi, non i valori. Per cercare tra i valori, scrivi 14 in ages.values().
  • «I dizionari hanno posizioni come le liste, quindi votes[0] è il primo candidato.» Un dizionario si interroga per chiave, non per posizione. votes[0] cerca una chiave uguale a 0 e dà KeyError: 0.
Nota per l'insegnanteI segni sulla carta sono il ponte. Conta prima a mano un piccolo insieme di voti veri o inventati, poi mostra che il dizionario è la stessa tabella, nome a sinistra e conteggio a destra. La riga get(key, 0) + 1 vale la pena di impararla a memoria come blocco unico, perché contare cose è il lavoro più comune dei dizionari nei progetti per principianti. Il controllo che i conteggi sommino di nuovo al numero di schede è un'abitudine da costruire presto. Nel corso coreano di informatica delle superiori, scegliere il tipo di dati giusto è uno standard a sé, e un confronto tra dizionario e lista ci sta bene.
Punti chiave
  • Un dizionario memorizza coppie chiave: valore in { }.
  • d[key] legge un valore; una chiave mancante dà KeyError.
  • d.get(key, default) evita il KeyError.
  • counts[x] = counts.get(x, 0) + 1 è lo schema per contare.
  • for k, v in d.items(): scorre le coppie nell'ordine in cui sono state aggiunte.
Fonti di questo corso (6)
  • Python Software Foundation, The Python Tutorial for Python 3.12 (docs.python.org/3.12/tutorial: 2 Using the Python Interpreter, 3 An Informal Introduction to Python (numbers, text, lists), 4 More Control Flow Tools (if, for, range, break and continue, defining functions, default argument values, 4.10 coding style: 4-space indentation), 5 Data Structures (list methods, 5.5 dictionaries, insertion order), 8 Errors and Exceptions (syntax errors, exceptions, reading the traceback, handling exceptions), 15 Floating-Point Arithmetic (0.1 + 0.2))
  • Built-in Functions (docs.python.org/3.12/library/functions.html: print, input, len, int, float, str, type, round (round half to even: round(0.5) and round(-0.5) are 0, round(1.5) is 2), range, sum, min, max, sorted)
  • Built-in Types (str methods upper, lower, replace, strip; dict.get; list.append, pop, remove, sort returning None)
  • General Python FAQ (docs.python.org/3.12/faq/general.html: Guido van Rossum began Python in the 1989 Christmas holidays, posted it to USENET in February 1991, named it after Monty Python's Flying Circus)
  • Curriculum for the Korean pages: 교육부 고시 제2022-33호 [별책 10] 정보과 교육과정 (PDF read 2026-10-19: 중학교 정보 [9정03-05] 리스트 등 데이터를 순차적으로 저장하는 구조, [9정03-06] 논리 연산과 중첩 제어 구조, [9정03-07] 함수 활용과 디버거로 오류 수정, [9정03-08] 실생활 문제를 프로그래밍으로 해결, 적용 시 고려 사항 「학생의 수준을 고려하여 적합한 프로그래밍 언어를 선정」; 고등학교 정보 [12정03-04] 자료형, [12정03-05] 표준입출력, [12정03-07] 제어 구조)
  • Bug story only: Smithsonian National Museum of American History, Log Book With Computer Bug, 1947, Harvard Mark II, "first actual case of bug being found", probably not Hopper's log book (americanhistory.si.edu/collections/object/nmah_334663, read 2026-10-19)

Consultato il: 2026-10-19