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