Hoofdstuk 6 - Dictionaries

01 - Een eenvoudige dictionary
  • Net als een list kan een dictionary (woordenboek) gegevens bevatten
  • Data in een dictionary is opgeslagen als een 'paar'
  • Een dictionary definieer je met zijn eigen tekens:
    • tuple = ( )
    • dictionary = { }
    • list = [ ]
  • De eenvoudigste dictionary heeft één key-value paar
  • Plaats de key tussen [ ] om de waarde te benaderen
hemellichamen = {'maan': 'Luna'}
print("De Romeinse god van de maan heet " + hemellichamen['maan'])
De Romeinse god van de maan heet Luna

  • Doorgaans zijn de key-value paren gerelateerd aan elkaar
  • De paren in een dictionary zijn gescheiden met een komma
week = {
     'maandag':'maan',
     'dinsdag':'mars',
     'woensdag':'mercurius',
     'donderdag':'jupiter',
     'vrijdag':'venus',
     'zaterdag':'saturnus',
     'zondag':'zon'
     }

print("Bij de woensdag hoort de planeet " + week['woensdag'].title())
Bij de woensdag hoort de planeet Mercurius

  • Een paar bestaat uit twee delen; key & value
  • De waarde van een key of van de value kan een integer, string, list, tuple of zelfs een andere dictionary zijn
  • Een item in een dictionary roep je aan met de key (en niet zoals in een list met een indexgetal)
  • Geef de key op en Python retourneert de value
02 - Key-value paren toevoegen, wijzigen en verwijderen
  • Je kunt met een lege dictionary beginnen en deze tijdens het programmaverloop vullen
month = {}
month['september'] = 7  
month['oktober'] = 8
month['december'] = 10
month['november'] = 9
print(month)
{'september': 7, 'oktober': 8, 'december': 10, 'november': 9}
  • Om een wijziging door te voeren geef je de naam van de dictionary, de key[ ] en de nieuwe waarde op
month['september'] = 9
month['oktober'] = 10
month['november'] = 11
month['december'] = 12
print(month)
{'september': 9, 'oktober': 10, 'december': 12, 'november': 11}
  • Om een item te verwijderen kun je de del-instructie gebruiken
  • Het enige dat de del-instructie nodig heeft is de naam van de dictionary en de key[ ]
del month['september']
print(month)
{'oktober': 10, 'december': 12, 'november': 11}
  • Een dictionary heeft geen methoden om alles te sorteren
  • Een item verwijderen en opnieuw toevoegen zorgt ervoor dat het aan het einde wordt toegevoegd
  • Gesorteerde dictionaries komen niet vaak voor
  • Wil je toch een dictionary sorteren; zet alles in een lijst, sorteer de lijst en maak van de gesorteerde lijst weer een dictionary

Dictionary sorteren?
month = {}
month['september'] = 9
month['oktober'] = 10
month['december'] = 12
month['november'] = 11

list_keys = dict(sorted(month.items()))
print("De keys gesorteerd\n", list_keys)

list_values = dict(sorted(month.items(), key=lambda x: x[1]))
print("De values gesorteerd\n", list_values)
De keys gesorteerd
 {'december': 12, 'november': 11, 'oktober': 10, 'september': 9}
De values gesorteerd
 {'september': 9, 'oktober': 10, 'november': 11, 'december': 12}

dict(sorted(month.items(), key=lambda x: x[1]))
# 1. month.items() → geeft lijst van (key, value) tuples.
# Bijvoorbeeld [('september', 9), ('oktober', 10), ...]
#
# 2. sorted(..., key=lambda x: x[1])
#    - sorted() sorteert de lijst
#    - key= bepaalt waarop gesorteerd moet worden
#    - lambda= kleine functie zonder naam
#    - x = elk item uit de lijst
#    - x[1] = het tweede element (in dit geval: de waarde)
#     sorteren gebeurt dus op de waarden van de dictionary
#
# 3. dict(...) zet de gesorteerde lijst tuples weer terug naar een dictionary.
  • Lambda-functies worden ook wel anonieme functies genoemd, omdat ze geen naam hebben
  • Lambda-functies zijn handig voor functies die je slechts één keer in je code gebruikt
  • Lambda-functies bieden geen extra mogelijkheden, maar maken de code compacter, omdat je geen aparte functie hoeft te schrijven
  • Ze houden de zaken netjes op één lijn

03 - Door een dictionary loop-en
  • Een dictionary kan één key-value paar bevatten of miljoenen
  • Je kunt door een dictionary loop-en op basis van:
    • .items( ) - (de sleutels EN de waarden)
    • .keys( ) - (alleen de sleutels)
    • .values( ) - (alleen de waarden)
  • De onderstaande dictionary wordt gebruikt om gegevens van een gebruiker op te slaan
user = {
    'username': 'Baudrillard',
    'first': 'Jean',
    'last': 'Baudrillard'
}
  • Als je alle waarden wilt zien uit de dictionary gebruik dan een for-loop
for key, value in user.items():
    print(key + " " + value)
username Baudrillard
first Jean
last Baudrillard

  • De key-valueparen hoeven niet in dezelfde volgorde te worden geretourneerd als waarin ze zijn opgeslagen
  • De woorden key en value in bovenstaande for-loop zijn zelfbedachte namen, alleen de letters k en v hadden ook gewerkt
  • Kies altijd logische namen voor zelfbedachte variabelen

matrix_astrology = {
    'neo': 'waterman',
    'trinity': 'schorpioen',
    'morpheus': 'leeuw',
    'smith': 'steenbok',
}

for name, sign in matrix_astrology.items():
    print(name.title() + "'s sterrenbeeld is " + sign.title())  
Neo's sterrenbeeld is Waterman
Trinity's sterrenbeeld is Schorpioen
Morpheus's sterrenbeeld is Leeuw
Smith's sterrenbeeld is Steenbok

Door alle keys van een dictionary loop-en
  • Wil je alleen de sleutels uit een dictionary pakken gebruik dan .keys( )
matrix_astrology = {
    'neo': 'waterman',
    'trinity': 'schorpioen',
    'morpheus': 'leeuw',
    'smith': 'steenbok',
}

for name in matrix_astrology.keys():
    print(name.title()) 
Neo
Trinity
Morpheus
Smith

Door de sleutels lopen is het standaard gedrag van een loop door een dictionary.
Daarom kan het korter geschreven worden met:
for name in matrix_astrology:


  • Wil je weten of een variabele als key mist in een dictionary, gebruik dan not in
matrix_astrology = {
    'neo': 'waterman',
    'trinity': 'schorpioen',
    'morpheus': 'leeuw',
    'smith': 'steenbok',
}

name  = "MySQL"

if name not in matrix_astrology:
    print(name.title() + " moet voor Oracle vervangen worden")  
Mysql moet voor Oracle vervangen worden

Door alle values van een dictionary loop-en
  • Wil je alleen de waarden uit een dictionary pakken gebruik dan .values( )
matrix_astrology = {
    'neo': 'waterman',
    'trinity': 'schorpioen',
    'morpheus': 'leeuw',
    'smith': 'steenbok',
}

for v in matrix_astrology.values():
    print(v)
waterman
schorpioen
leeuw
steenbok

  • De voorgaande aanpak haalt alle waarden op uit een dictionary zonder op herhaling te controleren
  • Bij een grote dataset in een dictionary is herhaling vaak ongewenst i.v.m. latere verwerking
  • Gebruik een set om herhaling te voorkomen
  • Een set is vergelijkbaar met een lijst maar in een set moet elk item uniek zijn
matrix_astrology = {
    'neo': 'waterman',
    'trinity': 'schorpioen',
    'morpheus': 'leeuw',
    'smith': 'steenbok',
    'oracle': 'waterman'
}

for value in set(matrix_astrology.values()):
    print(value.title())
Schorpioen
Leeuw
Waterman
Steenbok



De vier belangrijkste ingebouwde datastructuren van Python

Type Notatie Geordend Mutable Duplicaten Beste gebruik Gebruik (ongeveer)
List [] Ja Ja Ja Veranderbare lijst ± 40%
Tuple () Ja Nee Ja Vaste data ± 10%
Dict {key: value} Ja Ja Keys: uniek,
values: mogen herhalen
Mapping / "mini-database" ± 35%
Set {a, b} of set() Nee Ja Nee Unieke items / snel zoeken ± 15%
  • Je kunt een set schrijven met accolades, zoals: {'a', 'b'}
  • Maar voor een lege set moet je set() gebruiken, want {} is géén set.
  • Datastructuren behouden de volgorde waarin je dingen toevoegt, behalve bij een set
  • Een set is wel aan te passen maar de waarden moeten uniek zijn


  • Ben je op zoek naar een specifieke waarde gebruik dan een if-statement in je for-loop
matrix_astrology = {
    'neo': 'waterman',
    'trinity': 'schorpioen',
    'morpheus': 'leeuw',
    'smith': 'steenbok',
    'oracle': 'waterman'
}

zodiac = ['waterman', 'leeuw']

for key, value in matrix_astrology.items():
    if value in zodiac:
        print("hi, " + key.title() + ", " + value.title() + " is niet gek")
hi, Neo, Waterman is niet gek
hi, Morpheus, Leeuw is niet gek
hi, Oracle, Waterman is niet gek

04 - Nesten
  • Soms wil je een list in een dictionary opslaan of meerdere dictionaries in een list
  • Wanneer je lijsten, tuples of dictionaries in elkaar plaatst, noem je dat nesten
  • Je praat ook over nesten als je lijsten in één lijst plaatst of meerdere dictionaries in één dictionary
  • Nesten heeft veel mogelijkheden en toepassingen
Een list met dictionaries
product_01 = {
    'name': 'Amethist',
    'price': 22.50,
    'emotion': 'rust & kalmte',
    'role': 'Oracle'
}

product_02 = {
    'name': 'Rozenkwarts',
    'price': 9.95,
    'emotion': 'liefde & compassie',
    'role': 'Emotional Cipher'
}

product_03 = {
    'name': 'Bergkristal',
    'price': 14.00,
    'emotion': 'helderheid & balans',
    'role': 'The One'
}

product_04 = {
    'name': 'Lapis Lazuli',
    'price': 18.50,
    'emotion': 'inzicht & wijsheid',
    'role': 'The Architect'
}

shop = [product_01, product_02, product_03, product_04]

# Alle producten tonen
for item in shop:
    print(
        item['name'] + " - €" + str(item['price']) +
        " - emotie: " + item['emotion'] +
        " - rol: " + item['role']
    )
Amethist - €22.5 - emotie: rust & kalmte - rol: Oracle
Rozenkwarts - €9.95 - emotie: liefde & compassie - rol: Emotional Cipher
Bergkristal - €14.0 - emotie: helderheid & balans - rol: The One
Lapis Lazuli - €18.5 - emotie: inzicht & wijsheid - rol: The Architect
  • In bovenstaand voorbeeld is item een dictionary en met item[key] krijg je de bijbehorende value terug

Een list met dictionaries gegenereerd met de range()-functie
sale_01 = []

# We verkopen 50 rozenkwarts kralen
for number in range(50):
    bead = {
        'type': 'Rozenkwarts',
        'size_mm': 6,
        'emotion': 'liefde',
        'price': 0.12
    }
    sale_01.append(bead)

# Toon de eerste 5 kralen
for item in sale_01[:5]:
    print(item)

# Print het totaal aantal kralen
print("Totaal aantal op order: ", len(sale_01))
{'type': 'Rozenkwarts', 'size_mm': 6, 'emotion': 'liefde', 'price': 0.12}
{'type': 'Rozenkwarts', 'size_mm': 6, 'emotion': 'liefde', 'price': 0.12}
{'type': 'Rozenkwarts', 'size_mm': 6, 'emotion': 'liefde', 'price': 0.12}
{'type': 'Rozenkwarts', 'size_mm': 6, 'emotion': 'liefde', 'price': 0.12}
{'type': 'Rozenkwarts', 'size_mm': 6, 'emotion': 'liefde', 'price': 0.12}
Totaal aantal op order:  50

# Eerste product 10% korting
sale_01[0]['price'] = sale_01[0]['price'] * 0.9
print(sale_01[0:1])
[{'type': 'Rozenkwarts', 'size_mm': 6, 'emotion': 'liefde', 'price': 0.108}]

Een dictionary met een list
days = {
    'Dag': ['Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrijdag', 'Zaterdag', 'Zondag'],
    'Planeet': ['Maan', 'Mars', 'Mercurius', 'Jupiter', 'Venus', 'Saturnus', 'Zon']
}

print("Wie hoort niet in het rijtje thuis?: \n" + str(days['Planeet']) + "?")
print("Antwoord: De " + days['Planeet'][0] + " en de " + days['Planeet'][6])
print("Uitleg: De maan is geen planeet maar een maan, \nen de zon is geen planeet maar een ster.")
Wie hoort niet in het rijtje thuis?:
['Maan', 'Mars', 'Mercurius', 'Jupiter', 'Venus', 'Saturnus', 'Zon']?
Antwoord: De Maan en de Zon
Uitleg: De maan is geen planeet maar een maan,
en de zon is geen planeet maar een ster.

  • Met een for-loop kun je door de items van een dictionary lopen
  • Als de items op hun beurt weer bestaan uit lists gebruik dan een tweede for-loop om door de items van de list te lopen
days = {
    'Dag': ['Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrijdag', 'Zaterdag', 'Zondag'],
    'Planeet': ['Maan', 'Mars', 'Mercurius', 'Jupiter', 'Venus', 'Saturnus', 'Zon']
}

for item, value in days.items():
    print("\n" + item + ":")
    for i in value:
        print(i)
Dag:
Maandag
Dinsdag
Woensdag
Donderdag
Vrijdag
Zaterdag
Zondag

Planeet:
Maan
Mars
Mercurius
Jupiter
Venus
Saturnus
Zon

Of:

days = {
    'Dag': ['Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrijdag', 'Zaterdag', 'Zondag'],
    'Planeet': ['Maan', 'Mars', 'Mercurius', 'Jupiter', 'Venus', 'Saturnus', 'Zon']
}

for i in range(len(days['Dag'])):
    for j in range(len(days['Planeet'])):
        if i == j:   # koppelt de juiste dag aan de juiste planeet
            print(days['Dag'][i], "→", days['Planeet'][j])
Maandag → Maan
Dinsdag → Mars
Woensdag → Mercurius
Donderdag → Jupiter
Vrijdag → Venus
Zaterdag → Saturnus
Zondag → Zon

Een dictionary met een dictionary
  • Je kunt een dictionary in een dictionary nesten
  • Gebruik steeds dezelfde structuur, anders kan de code snel ingewikkeld worden
# platonic_solids is een dictionary: Deze heeft 5 key-value pairs
# De keys op het hoogste niveau zijn de namen van de platonische lichamen
# De value is een dictionary met vier key-value pairs.
platonic_solids = {
'tetrahedron': {
    'vlakken': 4,
    'rechte_randen': 6,
    'hoekpunten': 4,
    'planeet': 'mars'
},
'cube': {
    'vlakken': 6, 
    'rechte_randen': 12,
    'hoekpunten': 8,
    'planeet': 'saturnus'
},
'octahedron': {
    'vlakken': 8,
    'rechte_randen': 12,
    'hoekpunten': 6,
    'planeet': 'jupiter'
},
'dodecahedron': {
    'vlakken': 12,
    'rechte_randen': 30, 
    'hoekpunten': 20,
    'planeet': 'mercurius'
},
'icosahedron': {
    'vlakken': 20,
    'rechte_randen': 30,
    'hoekpunten':12,
    'planeet': 'venus'
}
}

print("DE VIJF PLATONISCHE LICHAMEN:")

for solid, info in platonic_solids.items():
    print(
        "Planeet: " + info['planeet'].title() +
        " | Vorm: " + solid.title() +
        " | Vlakken: " + str(info['vlakken'])
    )
DE VIJF PLATONISCHE LICHAMEN:
Planeet: Mars | Vorm: Tetrahedron | Vlakken: 4
Planeet: Saturnus | Vorm: Cube | Vlakken: 6
Planeet: Jupiter | Vorm: Octahedron | Vlakken: 8
Planeet: Mercurius | Vorm: Dodecahedron | Vlakken: 12
Planeet: Venus | Vorm: Icosahedron | Vlakken: 20
  • Je kunt lijsten en dictionaries beter niet te diep nesten
  • Als je dieper gaat nesten dan bovenstaande voorbeelden is er waarschijnlijk een betere manier om het probleem op te lossen


Oefening
Quiz

Vraag 1. Welke notatie maakt een dictionary met één key-valuepaar?




Goed! Je maakt een dictionary met accolades {} en een key: value paar.
Niet helemaal. Een dictionary gebruikt {} met key: value, niet [] of ().

Vraag 2. Welke van de volgende definities zijn geldige dictionaries?




Klopt. {} is een lege dictionary en {'a': 1, 'b': 2} bevat twee key-valueparen.
Let op. Een dictionary gebruikt {key: value}. Vierkante haken maken een list, en {1, 2, 3} is een set.

Vraag 3. Wat print deze code?

hemellichamen = {'maan': 'Luna', 'mars': 'Ares'}
print(hemellichamen['maan'])



Juist. Met hemellichamen['maan'] vraag je de value op van de key 'maan': 'Luna'.
Niet goed. Je geeft de key 'maan' door, dus je krijgt de value 'Luna' terug.

Vraag 4. Wat is de inhoud van month na deze code?

month = {'september': 7}
month['september'] = 9
print(month)



Goed! Een key in een dictionary is uniek. De tweede toekenning overschrijft de eerste value.
Let op. Een key kan maar één value hebben. De nieuwe waarde overschrijft de oude.

Vraag 5. Je hebt:

week = {
    'maandag': 'maan',
    'dinsdag': 'mars',
    'woensdag': 'mercurius'
}
print(len(week))

Wat wordt er geprint?




Klopt. len() op een dictionary geeft het aantal key-valueparen; hier zijn dat er 3.
Niet helemaal. len(week) telt key-valueparen, niet het totaal aantal karakters of zo.

Vraag 6. Welke for-loops geven je zowel de key als de value van een dictionary week?

week = {'maandag': 'maan', 'dinsdag': 'mars'}



Goed! week.items() geeft key en value, en met week.keys() kun je de value via week[dag] ophalen.
Let op. for dag in week en for planeet in week.values() geven je slechts één van de twee, niet allebei.

Vraag 7. Welke regel verwijdert correct de key 'woensdag' uit de dictionary week?

week = {
    'maandag': 'maan',
    'dinsdag': 'mars',
    'woensdag': 'mercurius'
}



Juist. Met del week['woensdag'] verwijder je het hele key-valuepaar uit de dictionary.
Nee. Alleen del week['woensdag'] verwijdert de key echt uit de dictionary.

Vraag 8. Wat doet matrix_astrology.values() in deze code?

matrix_astrology = {
    'neo': 'waterman',
    'trinity': 'schorpioen',
    'morpheus': 'leeuw'
}



Klopt. .values() geeft je alle values uit de dictionary.
Niet juist. .keys() geeft keys, .items() geeft key-valueparen, .values() alleen de waarden.

Vraag 9. Welke uitspraken over dictionaries zijn waar?




Goed! Keys moeten uniek zijn en een dictionary is ideaal als mapping of "mini-database". Values mogen juist wél herhalen.
Let op. Alleen keys moeten uniek zijn. Values mogen meerdere keren voorkomen.

Vraag 10. Kijk naar de code:

matrix_astrology = {
    'neo': 'waterman',
    'trinity': 'schorpioen',
    'oracle': 'waterman'
}

for value in set(matrix_astrology.values()):
    print(value.title())

Waarom wordt hier set(...) gebruikt rond matrix_astrology.values()?




Precies. Een set bevat alleen unieke items, dus dubbele sterrenbeelden worden automatisch verwijderd.
Niet helemaal. De set wordt gebruikt om dubbele values te verwijderen, zodat elk sterrenbeeld maar één keer verschijnt.