Python Dictionaries

T. Issaris

25 Januari 2021

Probleemstelling

Welk probleem lossen dictionaries op?

Stel je wil leeftijden van personen bijhouden… Hoe zou je dit kunnen doen met behulp van lijsten?

Lijst met leeftijden

Je zou een lijst met integers kunnen bijhouden, maar dan gaan de namen verloren:

leeftijden = [13, 9, 6]

Stel dat je de leeftijd van Alexander wil opvragen, dan moet je weten dat diens leeftijd op positie 1 staat:

print(leeftijden[0])

Geneste lijst met leeftijden

Je zou geneste lijsten kunnen gebruiken om de namen samen met de leeftijden op te slaan:

leeftijden = [
    ["Alexander", 13]
    ["Zarah", 9],
    ["Andreas", 6],
]

Maar je ziet in de code dan wel in welke positie Alexander in de lijst staat, maar je kan het moeilijk in code gebruiken:

print(leeftijden[0][1]) # toont 13, maar je moet nog steeds 0 invullen

Indexatie op naam

Dictionaries bieden hiervoor een heel handige oplossing:

leeftijden = {
    "Alexander": 13,
    "Zarah": 9,
    "Andreas": 6,
}
print(leeftijden["Alexander"]) # toont 13

Je kan dus de naam “Alexander” zelf als index gebruiken om de waarde op te vragen.

Indexatie op naam

Dictionaries zijn dus heel gelijkaardig aan lijsten, maar indexatie kan ook via andere datatypes dan integers.

a = [3, 4, 5]
print(a[1]) #  geeft 4

b = {"A": 3, "B": 4, "C": 5}
print(b["B"]) #  geeft 4

c = {1000: "duizend", 1000000: "miljoen"}
print(c[1000]) #  geeft "duizend"

Syntax

De lege dictionary

lege_dictionary = {}
leeftijden = {
    "Alexander": 13,
    "Zarah": 9,
    "Andreas": 6,
}

In bovenstaande code worden de leeftijden van 3 personen opgeslagen in de variabele leeftijden.

Accolades

leeftijden = {
    "Alexander": 13,
    "Zarah": 9,
    "Andreas": 6,
}

Je herkent dictionaries aan de accolades waarmee het begin en einde gemarkeerd worden.

Keys (sleutels)

leeftijden = {
    "Alexander": 13,
    "Zarah": 9,
    "Andreas": 6,
}

In bovenstaand voorbeeld worden “Alexander”, “Zarah” en “Andreas” de “sleutels” oftewel “keys” genoemd van de dictionary.

Values (waarden)

leeftijden = {
    "Alexander": 13,
    "Zarah": 9,
    "Andreas": 6,
}

13, 9 en 6 worden de overeenkomstige “values” oftewel “waardes” genoemd.

Key-value pair

leeftijden = {
    "Alexander": 13,
    "Zarah": 9,
    "Andreas": 6,
}

Het koppel (“Alexander”, 13) wordt een key-value pair genoemd.

Voorbeelden van dictionaries

Temperatuur op weekdag

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.
  • Keys: weekdagen
  • Values: temperaturen

Vakanties op weeknummer

vakanties = {
    7: "Krokus",
    14: "Paas",
    15: "Paas",
}
print(f"{vakanties[14]}vakantie")  
# toont "Paasvakantie"
  • Keys: weeknummers
  • Values: vakantienamen

Weekdagnaam op dagnummer

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.
  • Keys: dagnummer
  • Values: naam van de weekdag

Opvragen van waardes

We zagen reeds dat we met de vierkante haakjes de waarde van een bepaalde sleutel kunnen opvragen:

leeftijden = {
    "Alexander": 13,
    "Zarah": 9,
    "Andreas": 6,
}
print(leeftijden["Zarah"])  
# toont 9

Belangrijke operaties op dictionaries

Toevoegen van nieuwe data

Om Michael met leeftijden 20 toe te voegen, gebruiken we de vierkante haakjes:

leeftijden = {
    "Alexander": 13,
    "Zarah": 9,
    "Andreas": 6,
}
leeftijden["Michael"] = 21
print(leeftijd['Michael']) # toont 21

Aanpassen van bestaande data

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:

leeftijden = {
    "Alexander": 13,
    "Zarah": 9,
    "Andreas": 6,
    "Michael": 21,
}
print(leeftijd['Michael']) # toont 21
leeftijden["Michael"] = 20
print(leeftijd['Michael']) # toont 20

Elementen verwijderen met del

Met del kan je elementen verwijderen.

release_dates = {
    "Fortnite": 2017,
    "Cyberpunk 2077": 2020,
}
del release_dates["Fortnite"]
# release_dates == {"Cyberpunk 2077": 2020}

Elementen verwijderen met pop()

Ook met pop kan je elementen verwijderen:

release_dates = {
    "Fortnite": 2017,
    "Cyberpunk 2077": 2020,
}
release_dates.pop("Fortnite")
# release_dates == {"Cyberpunk 2077": 2020}

Elementen verwijderen met pop()

pop doet echter meer dan del: Het geeft als return value, de waarde overeenkomstig de gegeven key:

release_dates = {
    "Fortnite": 2017,
    "Cyberpunk 2077": 2020,
}
v = release_dates.pop("Fortnite")
print(v)  # toont 2017

clear()

Met clear() kan je alle keys en values uit uit dictionary verwijderen:

release_dates = {
    "Fortnite": 2017,
    "Cyberpunk 2077": 2020,
}
release_dates.clear()
print(release_dates)  # toont {}

list()

Met list() kan je een lijst opvragen met alle keys van een dictionary:

release_dates = {
    "Fortnite": 2017,
    "Cyberpunk 2077": 2020,
}
k = list(release_dates)
print(k)  # toont: ['Cyberpunk 2077', 'Fortnite']

len()

Met len() kan je het aantal key-value pairs in een dictionary opvragen:

release_dates = {
    "Fortnite": 2017,
    "Cyberpunk 2077": 2020,
}
l = len(release_dates)
print(l)  # toont: 2

Complexer dictionaries

Lijsten in dictionaries

De elementen van een dictionary mogen zelf ook complexere types zijn zoals lijsten:

hobbies = {
    "Alexander": ["volleybal", "games", "lezen"],
    "Zarah": ["volleybal", "games", "muziek", "tekenen"],
    "Andreas": ["volleybal", "games"],
}
print(hobbies['Andreas']) # toont: ['volleybal', 'games']
print(hobbies['Zarah'][2]) # toont: 'muziek'

Dictionaries in dictionaries

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'

Lijsten in dictionaries in een dictionary

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: volleybal

Dictionaries in lijsten

Andersom kan je ook een lijst van dictionary maken:

kinderen = [
    {"naam": "Alexander", "leeftijd": 13},
    {"naam": "Zarah", "leeftijd": 9},
    {"naam": "Andreas", "leeftijd": 6},
]
print(kinderen[1])
# toont: {'naam': 'Zarah', 'leeftijd': 9}
print(kinderen[0]['leeftijd'])
# toont: 13
print(kinderen[2]['naam'])
# toont: Andreas

For-loop

Itereren over dictionary

leeftijden = {
    "Alexander": 13,
    "Zarah": 9,
    "Andreas": 6,
}

for naam in leeftijden:
    print(naam)
# toont:
# Alexander
# Zarah
# Andreas

Naam bevat in de for-loop telkens de volgende key in de dictionary.

Itereren over dictionary

leeftijden = {
    "Alexander": 13,
    "Zarah": 9,
    "Andreas": 6,
}

for naam in leeftijden:
    print(naam, leeftijden[naam])
# toont:
# Alexander 13
# Zarah 9
# Andreas 6

Naam bevat in de for-loop telkens de volgende key in de dictionary. We kunnen deze als index gebruiken op dictionary leeftijden.

Itereren over dictionary met items()

leeftijden = {
    "Alexander": 13,
    "Zarah": 9,
    "Andreas": 6,
}

for naam, leeftijd in leeftijden.items():
    print(naam, leeftijd)
# toont:
# Alexander 13
# Zarah 9
# Andreas 6

We kunnen ook zowel de key als de value in de for-loop krijgen, mbv items().

Dubbele for-loop bij dictionaries

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
# blond

Voordelen van dictionaries

Enkele voordelen van dictionaries voor het voorstellen van complexere data zijn:

  • gebruiksgemak
  • snelheid
geboortedata_inwoners = [
    ["Jan Janssen", "1998/12/02"],
    ["Piet Bakkers", "2001/11/14"],
    ...
    ["Joris Peeters", "1966/01/24"],
]

Zoek de geboortedatum van “Joris Peeters”.

for persoon in geboortedatum_inwoners:
    if persoon == "Joris Peeters":
        return persoon[1]

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”.

geboortedata_inwoners["Joris Peeters"]

De gevraagde data kan onmiddellijk opgevraagd worden: Eenvoudiger en sneller.

Dictionaries en JSON

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.

Web APIs

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 API

GitHub bevat zo’n API, als we de informatie van gebruiker Torvalds opvragen, krijgen we dit:

curl https://api.github.com/users/torvalds
{
  "login": "torvalds",
  "id": 1024025,
  "type": "User",
  "site_admin": false,
  "name": "Linus Torvalds",
  "company": "Linux Foundation",
  "location": "Portland, OR",
  "created_at": "2011-09-03T15:26:22Z",
  "updated_at": "2021-01-10T19:36:11Z"
}

Dog API

Zo kunnen we foto’s opvragen van hondenrassen via onderstaande URL:

curl https://dog.ceo/api/breed/beagle/images/random

Dog API

Het resultaat is een JSON document:

{
    "message":"https://images.dog.ceo/breeds/beagle/n02088364_161.jpg",
    "status":"success"
}

In Python: Een dictionary met 2 keys:

  • message: met value een URL naar een foto
  • status: met value “success” als er een foto van ’t soort hond gevonden werd

Dog API - error

curl https://dog.ceo/api/breed/takis/images/random

Het resultaat is weer een JSON document:

{
    "status":"error",
    "message":"Breed not found (master breed does not exist)",
    "code":404
}

Publieke APIs

Een lijstje van beschikbare open APIs is te vinden op:

https://github.com/public-apis/public-apis

// reveal.js plugins