Hoofdstuk 9
Dictionaries en andere verzamelingen
Geef elke waarde een label
Een lijst is uitstekend wanneer de positie een handige manier is om een waarde te vinden. Het eerste item staat op index 0, het tweede op index 1, enzovoort.
Dat wordt onhandig wanneer de waarden verschillende feiten over één ding zijn.
book = ["Kindred", "Octavia E. Butler", 1979]
Wat betekent positie 1? Dat moet je onthouden. Wie book[1] leest, moet de definitie van de lijst opzoeken of op een commentaarregel vertrouwen.
Je zou de feiten over variabelen kunnen verdelen:
title = "Kindred"
creator = "Octavia E. Butler"
year = 1979
Voor één boek is dat duidelijk. Voor twintig boeken heb je twintig sets variabelenamen nodig.
Een record met labels
Een dictionary bewaart sleutel-waardeparen:
book = {
"title": "Kindred",
"creator": "Octavia E. Butler",
"year": 1979,
}
Elke sleutel benoemt de betekenis van zijn waarde:
| Sleutel | Waarde |
|---|---|
"title" | "Kindred" |
"creator" | "Octavia E. Butler" |
"year" | 1979 |
Je vraagt niet om een positie, maar om een sleutel:
print(book["creator"])
De haken lijken op indexering bij een lijst, maar het opzoeken werkt anders. Een lijst beantwoordt de vraag: “Wat staat op positie 1?” Een dictionary beantwoordt: “Welke waarde is opgeslagen onder de sleutel "creator"?”
Sleutels moeten uniek zijn
Een dictionary kan veel waarden bewaren, maar elke sleutel komt maar één keer voor. Als je een andere waarde aan een bestaande sleutel toewijst, verandert dat paar:
book["year"] = 1988
De dictionary heeft nog steeds één sleutel "year". De waarde is nu 1988.
Waarden hoeven niet uniek te zijn. Twee verschillende sleutels kunnen allebei "unknown" bevatten.
Dictionaries zijn veranderbaar
Net als een lijst kan een dictionary veranderen nadat die is aangemaakt. Je kunt:
een nieuw sleutel-waardepaar toevoegen;
de waarde voor een bestaande sleutel vervangen;
een paar verwijderen;
de inhoud lezen en er met een lus doorheen gaan.
Dit hoofdstuk richt zich op toevoegen, wijzigen, lezen en doorlopen. Hoofdstuk 10 komt terug op de fouten die kunnen ontstaan wanneer een programma om een ontbrekende sleutel vraagt.
Modelleer de informatie, niet de weergave
De dictionary bevat feiten:
book = {
"title": "Kindred",
"creator": "Octavia E. Butler",
"year": 1979,
}
Een functie kan bepalen hoe die worden getoond:
def book_label(book):
return f"{book['title']} by {book['creator']}"
Die scheiding gebruikt het functieontwerp uit hoofdstuk 8. De dictionary modelleert het record. De functie voert er een bewerking mee uit.
Wat drukt dit programma af?
place = {
"name": "Kyoto",
"country": "Japan",
}
print(place["country"])
Welke informatie kun je het natuurlijkst als één dictionary modelleren?