edubun
Nederlands

Woordenboeken

Een ontbrekende woordenboeksleutel opzoeken stopt het programma met KeyError, maar d.get(key, 0) geeft in plaats daarvan 0.

Seoyeon heeft 12 stembiljetten en drie kandidaten

AchtergrondSeoyeon (een verzonnen leerling) telt de stemmen voor klassenvertegenwoordiger. Drie klasgenoten zijn kandidaat: Ari, Bo en Cy. Twaalf gevouwen stembiljetten zitten in een doos. Op papier zou ze de drie namen onder elkaar zetten en bij elk geopend biljet een turfstreep naast de naam. Ze wil hetzelfde in Python en ontdekt snel dat een lijst onhandig is. Ze zou moeten onthouden dat positie 0 Ari en positie 1 Bo is. Ze wil een tabel die direct van een naam naar een getal gaat.

Die tabel is een woordenboek. Een woordenboek bewaart paren: een sleutel en de bijbehorende waarde. Je schrijft het tussen accolades, met een dubbele punt tussen sleutel en waarde. Zet de sleutel tussen vierkante haken om een waarde te lezen, zoals een index na een lijst. Ken aan die sleutel toe om een paar toe te voegen of te veranderen.

votes = {"Ari": 0, "Bo": 0, "Cy": 0}
votes["Bo"] = votes["Bo"] + 1
votes["Ari"] += 1
votes["Bo"] += 1
print(votes)
print(votes["Bo"])
Uitvoer
{'Ari': 1, 'Bo': 2, 'Cy': 0}
2
Een woordenboek koppelt elke sleutel aan één waarde. votes["Bo"] gaat direct naar 5 zonder posities te tellen.

De hele doos tellen in één lus

Eén regel per biljet typen is niet beter dan turven. Seoyeon zet de biljetten in een lijst en loopt erdoor. Eén probleem: wat als een biljet iemand noemt die niet vooraf is ingesteld, of ze de kandidaten liever niet eerst opschrijft? Een ontbrekende sleutel met haken lezen stopt het programma. De methode get(key, default) lost dit op. Zij geeft de waarde bij een bestaande sleutel en anders de standaard, dus votes.get(name, 0) + 1 werkt voor de eerste en elke volgende stem.

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()))
Uitvoer
{'Bo': 6, 'Ari': 3, 'Cy': 3}
12 12

De laatste regel is Seoyeons controle. Er gingen twaalf biljetten in en de tellingen tellen op tot twaalf, dus er is niet één biljet kwijtgeraakt. Let op de volgorde van de namen in de uitvoer: Bo staat eerst, omdat de lus die naam eerst tegenkwam. Sinds Python 3.7 bewaart een woordenboek sleutels in de volgorde van eerste toevoeging; de handleiding zegt hetzelfde in het onderdeel over woordenboeken.

Samen door sleutels en waarden lopen

Een for-lus over een woordenboek geeft sleutels. items() geeft sleutel en waarde samen, handig voor een resultatentabel. in test of een sleutel bestaat en max() met key=votes.get vindt de sleutel met de grootste waarde. Dat laatste patroon kun je letterlijk overnemen, ook voordat elk onderdeel duidelijk is.

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))
Uitvoer
Bo ###### 6
Ari ### 3
Cy ### 3
False
Bo

Woordenboeken komen overal voor waar gegevens uit paren van een naam en een waarde bestaan: een woord en zijn betekenis, een metrostation en zijn lijnnummer, een leerlingnummer en een naam. Sleutels moeten uniek zijn; toekennen aan een bestaande sleutel vervangt de oude waarde in plaats van een tweede kopie toe te voegen.

woordenboekSleutel: waarde-paren in { }
sleutelDe naam waarmee je een waarde opzoekt; sleutels zijn uniek
d[key]Leest de waarde; KeyError als de sleutel ontbreekt
d.get(key, default)Leest de waarde of geeft de standaard als de sleutel ontbreekt
d.items()Sleutel-waardeparen voor een for-lus
key in dTrue als het woordenboek die sleutel heeft
  1. Wat drukt deze code af?
    price = {"gimbap": 3500, "ramen": 4500}
    print(price["ramen"])
  2. Wat drukt deze code af?
    price = {"gimbap": 3500}
    price["tteokbokki"] = 5000
    print(len(price))
  3. Wat drukt deze code af?
    price = {"gimbap": 3500}
    price["gimbap"] = 4000
    print(price)
  4. Wat drukt deze code af?
    stock = {"pens": 4}
    print(stock.get("pens", 0), stock.get("tape", 0))
  5. Wat gebeurt er wanneer dit wordt uitgevoerd?
    stock = {"pens": 4}
    print(stock["tape"])
    • Het drukt 0 af
    • Het drukt None af
    • Het drukt tape af
    • Het stopt met KeyError: 'tape'
  6. Wat drukt deze code af?
    counts = {}
    for ch in "hallo":
        counts[ch] = counts.get(ch, 0) + 1
    print(counts["l"])
  7. Wat drukt deze code af?
    ages = {"Mina": 14, "Jun": 13}
    print("Jun" in ages, 14 in ages)
  8. Wat drukt deze code af?
    d = {"b": 2, "a": 1}
    for k in d:
        print(k)
    • a
      b
    • b
      a
    • 2
      1
    • b 2
      a 1
  9. Wat drukt deze code af?
    scores = {"Ari": 3, "Bo": 6, "Cy": 3}
    print(max(scores, key=scores.get))
  10. Wat drukt deze code af?
    d = {"x": 1, "y": 2}
    total = 0
    for k, v in d.items():
        total += v
    print(total)
Veelgemaakte fouten
  • ‘votes["Dan"] geeft 0 als Dan geen stemmen kreeg.’ Als "Dan" nooit als sleutel is toegevoegd, stopt opzoeken met KeyError: 'Dan'. Gebruik votes.get("Dan", 0) als een sleutel kan ontbreken.
  • ‘14 in ages test of iemand 14 is.’ in bekijkt sleutels, geen waarden. Schrijf 14 in ages.values() om waarden te doorzoeken.
  • ‘Woordenboeken hebben posities zoals lijsten, dus votes[0] is de eerste kandidaat.’ Een woordenboek wordt op sleutel opgezocht, niet op positie. votes[0] zoekt een sleutel gelijk aan 0 en geeft KeyError: 0.
Voor de docentTurven op papier is de brug. Tel eerst enkele echte of verzonnen stemmen met de hand en toon dat het woordenboek dezelfde tabel is: naam links, aantal rechts. De regel get(key, 0) + 1 is het onthouden waard omdat tellen de meest voorkomende woordenboektaak in beginnersprojecten is. Ook controleren of de aantallen tot het aantal biljetten optellen is een goede vroege gewoonte. In de Koreaanse informatica voor de bovenbouw is het juiste gegevenstype kiezen een eigen standaard; een vergelijking tussen woordenboek en lijst past daarbij.
Belangrijkste punten
  • Een woordenboek bewaart sleutel: waarde-paren in { }.
  • d[key] leest een waarde; een ontbrekende sleutel geeft KeyError.
  • d.get(key, default) vermijdt de KeyError.
  • counts[x] = counts.get(x, 0) + 1 is het telpatroon.
  • for k, v in d.items(): doorloopt paren in de volgorde waarin ze zijn toegevoegd.
Bronnen van deze cursus (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)

Geraadpleegd: 2026-10-19