T. Issaris
25 Januari 2021
Welk probleem lossen dictionaries op?
Stel je wil leeftijden van personen bijhouden… Hoe zou je dit kunnen doen met behulp van lijsten?
Je zou een lijst met integers kunnen bijhouden, maar dan gaan de namen verloren:
Stel dat je de leeftijd van Alexander wil opvragen, dan moet je weten dat diens leeftijd op positie 1 staat:
Je zou geneste lijsten kunnen gebruiken om de namen samen met de leeftijden op te slaan:
Maar je ziet in de code dan wel in welke positie Alexander in de lijst staat, maar je kan het moeilijk in code gebruiken:
Dictionaries bieden hiervoor een heel handige oplossing:
leeftijden = {
"Alexander": 13,
"Zarah": 9,
"Andreas": 6,
}
print(leeftijden["Alexander"]) # toont 13Je kan dus de naam “Alexander” zelf als index gebruiken om de waarde op te vragen.
Dictionaries zijn dus heel gelijkaardig aan lijsten, maar indexatie kan ook via andere datatypes dan integers.
In bovenstaande code worden de leeftijden van 3 personen opgeslagen in de variabele leeftijden.
Je herkent dictionaries aan de accolades waarmee het begin en einde gemarkeerd worden.
In bovenstaand voorbeeld worden “Alexander”, “Zarah” en “Andreas” de “sleutels” oftewel “keys” genoemd van de dictionary.
13, 9 en 6 worden de overeenkomstige “values” oftewel “waardes” genoemd.
Het koppel (“Alexander”, 13) wordt een key-value pair genoemd.
temp = {
"maandag": 3,
"dinsdag": 3,
"woensdag": 3,
"donderdag": 10,
"vrijdag": 9,
"zaterdag": 5,
"zondag": 3,
}
i = "vrijdag"
print(f"Het wordt op {i} {temp[i]} graden.")
# toont: Het wordt op vrijdag 9 graden.vakanties = {
7: "Krokus",
14: "Paas",
15: "Paas",
}
print(f"{vakanties[14]}vakantie")
# toont "Paasvakantie"week_dagen = {
1: "maandag",
2: "dinsdag",
3: "woensdag",
4: "donderdag",
5: "vrijdag",
6: "zaterdag",
7: "zondag",
}
i = 4
print(f"Dag {i} heet {week_dagen[i]}.")
# toont: Dag 4 heet donderdag.We zagen reeds dat we met de vierkante haakjes de waarde van een bepaalde sleutel kunnen opvragen:
Om Michael met leeftijden 20 toe te voegen, gebruiken we de vierkante haakjes:
Je kan met vierkante haakjes bestaande waardes ook aanpassen. Michael blijkt geen 21, maar 20 jaar, we kunnen de waarde aan de hand van de sleutel “Michael” overschrijven:
delMet del kan je elementen verwijderen.
pop()Ook met pop kan je elementen verwijderen:
pop()pop doet echter meer dan del: Het geeft als return value, de waarde overeenkomstig de gegeven key:
Met clear() kan je alle keys en values uit uit dictionary verwijderen:
Met list() kan je een lijst opvragen met alle keys van een dictionary:
Met len() kan je het aantal key-value pairs in een dictionary opvragen:
De elementen van een dictionary mogen zelf ook complexere types zijn zoals lijsten:
De elementen van een dictionary mogen zelf ook complexere types zijn zoals lijsten:
kinderen = {
"Alexander": {"leeftijd": 13, "haarkleur": "bruin"},
"Zarah": {"leeftijd": 9, "haarkleur": "donkerblond"},
"Andreas": {"leeftijd": 6, "haarkleur": "blond"},
}
print(kinderen['Alexander'])
# toont: {'leeftijd': 13, 'haarkleur': 'bruin'}
print(kinderen['Zarah']['haarkleur'])
# toont: 'donkerblond'En je kan dit patroon ook verder zetten, door lijsten in een dictionary van dictionaries te plaatsen:
hobbies = {
"Alexander": {"leeftijd": 13, "hobbies": ["volleybal", "games", "lezen"]},
"Zarah": {"leeftijd": 9, "hobbies": ["volleybal", "games", "muziek", "tekenen"]},
"Andreas": {"leeftijd": 6, "hobbies": ["volleybal", "games"]},
}
print(kinderen['Alexander']['hobbies'])
# toont: ['volleybal', 'games']
print(kinderen['Zarah']['leeftijd'])
# toont: 9
print(kinderen['Andreas']['hobbies'][0])
# toont: volleybalAndersom kan je ook een lijst van dictionary maken:
leeftijden = {
"Alexander": 13,
"Zarah": 9,
"Andreas": 6,
}
for naam in leeftijden:
print(naam)
# toont:
# Alexander
# Zarah
# AndreasNaam bevat in de for-loop telkens de volgende key in de dictionary.
leeftijden = {
"Alexander": 13,
"Zarah": 9,
"Andreas": 6,
}
for naam in leeftijden:
print(naam, leeftijden[naam])
# toont:
# Alexander 13
# Zarah 9
# Andreas 6Naam bevat in de for-loop telkens de volgende key in de dictionary. We kunnen deze als index gebruiken op dictionary leeftijden.
items()leeftijden = {
"Alexander": 13,
"Zarah": 9,
"Andreas": 6,
}
for naam, leeftijd in leeftijden.items():
print(naam, leeftijd)
# toont:
# Alexander 13
# Zarah 9
# Andreas 6We kunnen ook zowel de key als de value in de for-loop krijgen, mbv items().
Met behulp van een dubbele for-loop kunnen we over alle data in een geneste dictionary itereren:
kinderen = {
"Alexander": {"leeftijd": 13, "haarkleur": "bruin"},
"Zarah": {"leeftijd": 9, "haarkleur": "donkerblond"},
"Andreas": {"leeftijd": 6, "haarkleur": "blond"},
}
for naam in kinderen:
print(naam)
for info in kinderen[naam]:
print(kinderen[naam][info])
# toont:
# Alexander
# 13
# bruin
# Zarah
# 9
# donkerblond
# Andreas
# 6
# blondEnkele voordelen van dictionaries voor het voorstellen van complexere data zijn:
geboortedata_inwoners = [
["Jan Janssen", "1998/12/02"],
["Piet Bakkers", "2001/11/14"],
...
["Joris Peeters", "1966/01/24"],
]Zoek de geboortedatum van “Joris Peeters”.
De hele lijst moet doorlopen worden… voor 10 miljoen inwoners…
geboortedata_inwoners = {
"Jan Janssen": "1998/12/02",
"Piet Bakkers": "2001/11/14",
...
"Joris Peeters": "1966/01/24",
}Zoek de geboortedatum van “Joris Peeters”.
De gevraagde data kan onmiddellijk opgevraagd worden: Eenvoudiger en sneller.
Zulke geneste datastructuren worden in de praktijk enorm veel gebruikt. Een veel gebruikt formaat om gegevens uit te wisselen is JSON. Dit formaat komt sterk overeen met geneste Python dictionaries en lists.
Veel websites laten toe om informatie op te vragen aan de hand van een URL-structuur die als resultaat JSON teruggeeft.
Dit is ook de manier waarop veel iPhone en Android apps gegevens van servers ophalen.
GitHub bevat zo’n API, als we de informatie van gebruiker Torvalds opvragen, krijgen we dit:
Zo kunnen we foto’s opvragen van hondenrassen via onderstaande URL:
Het resultaat is een JSON document:
In Python: Een dictionary met 2 keys:
Het resultaat is weer een JSON document:
Een lijstje van beschikbare open APIs is te vinden op: