De winnaar
De buren hebben gestemd, en de stemmen staan in een dictionary. Nu zoek je
de soort met de meeste stemmen: dat is de voorspelling. Daarna stop je alles
in één functie, voorspel(nieuw, voorbeelden, k), die je in de volgende
projecten weer gebruikt.
Voorspel
stemmen = {"banaan": 1, "appel": 2}
winnaar = ""
meeste = 0
for soort in stemmen:
if stemmen[soort] > meeste:
meeste = stemmen[soort]
winnaar = soort
print(winnaar)
Wat print dit programma?
Antwoord
appel
Zo werkt het
Een loop over een dictionary geeft je de sleutels: hier de soorten. Met
stemmen[soort] pak je het aantal stemmen. De loop onthoudt de soort met de
meeste stemmen tot nu toe, zoals je bij de dichtstbijzijnde buur de kleinste
afstand onthield.
Onderzoek
- Draai de code. Wie wint?
- Maak er een gelijke stand van:
{"banaan": 1, "appel": 1}. Wie wint er nu? Dit is de stand bijk = 2. - Draai de volgorde om:
{"appel": 1, "banaan": 1}. Wie wint er nu? - Bij
k = 7stemmen alle zeven voorbeelden mee:{"banaan": 4, "appel": 3}. Wie wint er, en wat betekent dat voor elk nieuw stuk fruit?
Antwoorden
- Appel, met twee stemmen tegen één. De vergissing verliest.
- Banaan. De loop neemt een soort alleen over als die méér stemmen heeft dan de beste tot nu toe, niet evenveel. Banaan staat als eerste in de dictionary, dus banaan wint.
- Appel. Bij een gelijke stand wint de soort die het eerst in de dictionary
kwam. Daarom kies je voor
kmeestal een oneven getal. - Banaan wint met vier tegen drie. Met alle voorbeelden wint de soort waar je
de meeste voorbeelden van hebt, wat het nieuwe fruit ook is. Een te grote
kmaakt de voorspeller dom. Een goedekzit ertussenin.
Opdracht: voorspel met k
Maak van de code een functie voorspel(nieuw, voorbeelden, k) die de
winnaar teruggeeft. Test hem zo:
print(voorspel((10, 7), voorbeelden, 1)) # banaan
print(voorspel((10, 7), voorbeelden, 3)) # appel
Begin klein, en breid de code stap voor stap uit:
- Draai de code:
voorspelgeeft dekburen terug, nog niet de winnaar. - Tel met een dictionary
stemmenhoeveel buren elke soort heeft, en geefstemmenterug. - Zoek de soort met de meeste stemmen: loop over
stemmen, en onthoud met eenifde soort met het hoogste aantal. Geef die soort terug.
In de editor staat voorspel met het eerste stuk: de buren zoeken.
Tip
Na stap 2 print de code {'banaan': 1} en {'banaan': 1, 'appel': 2}.
Zie je dat niet, kijk dan of de return na de loop staat, op dezelfde
inspringing als de for.
Antwoord
def afstand(a, b):
return abs(a[0] - b[0]) + abs(a[1] - b[1])
def voorspel(nieuw, voorbeelden, k):
paren = []
for maten, soort in voorbeelden:
paren.append((afstand(nieuw, maten), soort))
buren = sorted(paren)[:k]
stemmen = {}
for d, soort in buren:
if soort in stemmen:
stemmen[soort] = stemmen[soort] + 1
else:
stemmen[soort] = 1
winnaar = ""
meeste = 0
for soort in stemmen:
if stemmen[soort] > meeste:
meeste = stemmen[soort]
winnaar = soort
return winnaar
voorbeelden = [
((8, 8), "appel"), ((9, 8), "appel"), ((7, 7), "appel"),
((18, 4), "banaan"), ((20, 4), "banaan"), ((17, 3), "banaan"),
((10, 6), "banaan"),
]
print(voorspel((10, 7), voorbeelden, 1)) # banaan
print(voorspel((10, 7), voorbeelden, 3)) # appel
Deze functie gebruik je in de volgende stappen en projecten weer. Daar staat hij klaar in de verborgen code onder de editor.
Door naar bekijk de buren.