Goed per soort
Met seed 4 had de voorspeller alles goed, omdat er geen enkele citroen in de toets zat. Een score over alles samen kan zo een probleem verstoppen. In deze stap tel je per soort: hoeveel stukken fruit van die soort zitten er in de toets, en hoeveel daarvan heeft hij goed?
Voorspel
totaal = {"appel": 2, "citroen": 2}
goed = {"appel": 2, "citroen": 1}
for soort in totaal:
print(soort, goed[soort], "van de", totaal[soort], "goed")
Wat print dit programma?
Antwoord
appel 2 van de 2 goed
citroen 1 van de 2 goed
Samen is het 3 van de 4, en dat klinkt goed. Per soort zie je dat het bij de citroenen misgaat.
Zo werkt het
Je telt met twee dictionaries, allebei met de soort als sleutel. totaal
telt hoeveel stukken fruit van elke soort in de toets zitten. goed telt
hoeveel daarvan de voorspeller goed heeft. Na de loop leg je ze per soort
naast elkaar.
Opdracht: goed per soort
Tel per soort hoeveel stukken fruit er in de toetsset zitten, en hoeveel
daarvan de voorspeller goed heeft. Met seed 3 en k = 1 print je:
banaan 2 van de 2 goed
appel 2 van de 2 goed
citroen 1 van de 2 goed
Begin klein, en breid de code stap voor stap uit:
- Draai de code: hij print de soort van elk stuk fruit in de toetsset.
- Tel met een dictionary
totaalhoeveel stukken fruit van elke soort erin zitten, zoals je in het spamfilter woorden telde. Printtotaalna de loop. - Zet in de loop een
ifdie kijkt ofvoorspel(maten, oefen, k)gelijk is aansoort, en tel dat in een tweede dictionarygoed. - Loop na de loop over
totaal, en print per soort een regel zoals hierboven.
In de editor staan het fruit en het verdelen uit de vorige stappen, met een loop over de toetsset.
Tip
Stopt Python bij het printen met een foutmelding over een soort? Een soort die
hij nooit goed heeft, komt dan niet in goed. Zet daarom in goed aan het begin elke soort op 0.
Antwoord
Dit vervangt de loop onderaan de code in de editor:
totaal = {}
goed = {"appel": 0, "banaan": 0, "citroen": 0}
for maten, soort in toets:
if soort in totaal:
totaal[soort] = totaal[soort] + 1
else:
totaal[soort] = 1
if voorspel(maten, oefen, k) == soort:
goed[soort] = goed[soort] + 1
for soort in totaal:
print(soort, goed[soort], "van de", totaal[soort], "goed")
banaan 2 van de 2 goed
appel 2 van de 2 goed
citroen 1 van de 2 goed
Nu zie je dat de citroenen het moeilijkst zijn: sommige liggen even dicht bij een appel als bij een andere citroen.
Er gaat iets mis
KeyError: 'citroen'
Oorzaak: je vraagt goed["citroen"], maar de voorspeller had geen enkele
citroen goed. Je telde alleen bij een goede voorspelling, dus de sleutel
"citroen" is nooit gemaakt.
Oplossing: zet in goed vóór de loop elke soort op 0.
# FOUT
goed = {}
# GOED
goed = {"appel": 0, "banaan": 0, "citroen": 0}
Door naar de luie voorspeller.