Stemmen tellen
Je hebt de k dichtstbijzijnde buren gevonden. Nu stemt elke buur op zijn
eigen soort. Die stemmen tel je met een dictionary, zoals je in het
spamfilter woorden telde: de soort is de sleutel, het aantal stemmen de
waarde.
Voorspel
buren = [(1, "banaan"), (2, "appel"), (3, "appel")]
stemmen = {}
for d, soort in buren:
if soort in stemmen:
stemmen[soort] = stemmen[soort] + 1
else:
stemmen[soort] = 1
print(stemmen)
Wat print dit programma?
Antwoord
{'banaan': 1, 'appel': 2}
Zo werkt het
Elke buur is een tuple (afstand, soort). Voor het tellen heb je alleen de
soort nodig; de afstand staat in d en doet verder niets.
Staat een soort nog niet in stemmen, dan krijgt hij zijn eerste stem: 1.
Staat hij er al, dan komt er 1 bij. De dictionary onthoudt de volgorde
waarin de soorten erin kwamen: hier eerst banaan, want de dichtstbijzijnde
buur is een banaan.
Onderzoek
- Draai de code. Hoeveel stemmen krijgt elke soort?
- Zet
(4, "citroen")onderaan inburen. Wat verandert er instemmen? - Vervang de hele
ifenelsedoor één regel:stemmen[soort] = stemmen[soort] + 1. Wat gebeurt er?
Antwoorden
- Banaan 1, appel 2.
- Er komt een derde sleutel bij:
{'banaan': 1, 'appel': 2, 'citroen': 1}. Voor een nieuwe soort hoef je niets aan de code te veranderen. - Python stopt met een foutmelding over
'banaan': de eerste keer staat banaan nog niet instemmen, dus er is niets om 1 bij op te tellen. Zie er gaat iets mis hieronder.
Opdracht: tel de stemmen van de buren
In de editor staat het zoeken van de buren uit de vorige stap. Tel de stemmen van die buren:
buren: [(1, 'banaan'), (2, 'appel'), (3, 'appel')]
stemmen: {'banaan': 1, 'appel': 2}
Begin klein, en breid de code stap voor stap uit:
- Draai de code: hij print de drie buren.
- Tel met een dictionary
stemmenhoeveel buren elke soort heeft, en printstemmen. - Zet
kop 1, op 2 en op 7, en bekijk bij elkekde stemmen.
Tip
Een buur is een tuple met twee dingen erin. Welk van de twee is de sleutel in
stemmen?
Antwoord
Dit komt onder de print van de buren:
stemmen = {}
for d, soort in buren:
if soort in stemmen:
stemmen[soort] = stemmen[soort] + 1
else:
stemmen[soort] = 1
print("stemmen:", stemmen)
stemmen: {'banaan': 1, 'appel': 2}
Met k = 1 krijg je {'banaan': 1}: alleen de vergissing stemt. Met
k = 2 staat het gelijk, {'banaan': 1, 'appel': 1}. Met k = 7 stemmen
alle voorbeelden mee: {'banaan': 4, 'appel': 3}. Wie er dan wint, zie je in
de volgende stap.
Er gaat iets mis
KeyError: 'banaan'
Oorzaak: je telt 1 op bij een soort die nog niet in de dictionary staat.
stemmen["banaan"] bestaat pas als je hem een eerste waarde hebt gegeven.
Oplossing: kijk eerst met in of de soort er al in staat. Zo niet, zet
hem dan op 1.
# FOUT
stemmen[soort] = stemmen[soort] + 1
# GOED
if soort in stemmen:
stemmen[soort] = stemmen[soort] + 1
else:
stemmen[soort] = 1
Door naar de winnaar.