Sprint 4 ยท Datastructuren & foutafhandeling  ยท  US1: Dictionaries

Als developer, wil ik bij elkaar horende gegevens onder รฉรฉn naam bewaren in plaats van in losse lijsten, zodat de koppeling niet kan verschuiven en ik in รฉรฉn oogopslag zie wat bij elkaar hoort.

Taak 1: Parallelle lijsten

Twee aparte lijsten voor product en aantal โ€” รฉรฉn fout in de volgorde en de klant krijgt drie broden en รฉรฉn fles melk in plaats van andersom.

Parallelle lijsten: het probleem

Stel: je monitort computers en wilt hostname en CPU-temperatuur bijhouden. De voor de hand liggende aanpak: twee aparte lijsten.

hostnames = ["server1", "server2", "server3"]
cpu_temps  = [65, 72, 58]

Maar hier zit het probleem: deze twee lijsten moeten altijd synchroon lopen. Als iemand de volgorde van รฉรฉn lijst verandert en de ander vergeet, klopt alles niet meer. Python ziet geen verband tussen de lijsten.

Drie concrete problemen

  1. Onzichtbare koppeling: de relatie tussen hostnames[i] en cpu_temps[i] bestaat alleen in jouw hoofd
  2. Makkelijk fout: verander รฉรฉn lijst en vergeet de ander โ†’ broken data
  3. Niet uitbreidbaar: meer eigenschappen? Meer lijsten. Vijf lijsten wordt snel chaotisch.

De oplossing: dictionary

Een dictionary koppelt sleutels (namen) aan waarden. Hostname en temperatuur zitten in รฉรฉn object โ€” ze kunnen niet uit elkaar raken.

server = {"hostname": "server1", "cpu_temp": 65}

servers = [
    {"hostname": "server1", "cpu_temp": 65},
    {"hostname": "server2", "cpu_temp": 72},
    {"hostname": "server3", "cpu_temp": 58},
]
Vuistregel: als twee waarden altijd bij elkaar horen, gebruik een dictionary. Als je veel van zulke groepjes hebt, gebruik een lijst van dictionaries.
๐Ÿ˜ฉ Twee lijsten (probleem)
products  = ["brood", "melk",
             "kaas", "appels"]
quantities = [1, 3, 2, 6]

products  = ["brood", "melk",
             "appels", "kaas"]
              # omgewisseld!
# Koppeling is kapot.
โœจ Dictionary (oplossing)
line = {
  "product": "brood",
  "quantity": 1
}

# Richting en afstand
# kunnen niet uit
# elkaar raken.

Interactieve demo

Typ een bestelregel (bijv. brood 2) om te zien hoe dat als dictionary eruit ziet:

simulator โ€” dict_preview.py
Typ: <product> <aantal> bijv. brood 2
$
Producten: brood ยท melk ยท kaas ยท appels ยท eieren ยท koffie
>_ Probeer het voorbeeld

Experimenteer hier: maak parallelle lijsten, mutateer รฉรฉn ervan, en zie hoe snel de koppeling breekt.

Klik op de knop om de uitvoer van het voorbeeld te zien.

Opdracht: het probleem demonstreren

Een webshop bewaart bestellingen in twee losse lijsten: รฉรฉn met producten en รฉรฉn met aantallen. Schrijf parallel_pain.py en laat zien waarom dat vroeg of laat misgaat.

  1. Maak twee lijsten met minstens vier bestelregels: de producten en de bijbehorende aantallen.
  2. Print elke bestelregel, met het regelnummer erbij.
  3. Zet nu twee producten in een andere volgorde โ€” en laat de aantallen staan.
  4. Print de bestelling opnieuw en laat zien dat de klant nu iets anders krijgt dan hij besteld heeft.
  5. Zet er als commentaar onder waarom Python hier geen foutmelding geeft.

Acceptatiecriteria

  • Script heet parallel_pain.py en heeft twee lijsten met minstens vier elementen.
  • Beide overzichten worden met een lus geprint, niet met losse print-regels.
  • Na het omwisselen hoort bij minstens twee regels het verkeerde aantal.
  • De uitvoer laat duidelijk zien wat er nu fout is aan de bestelling.
  • In je commentaar staat waarom Python dit niet kan zien.