Ga naar hoofdinhoud

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​

  1. Draai de code. Hoeveel stemmen krijgt elke soort?
  2. Zet (4, "citroen") onderaan in buren. Wat verandert er in stemmen?
  3. Vervang de hele if en else door één regel: stemmen[soort] = stemmen[soort] + 1. Wat gebeurt er?
Python
Code-omgeving wordt voorbereid…
Antwoorden
  1. Banaan 1, appel 2.
  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.
  3. Python stopt met een foutmelding over 'banaan': de eerste keer staat banaan nog niet in stemmen, 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:

  1. Draai de code: hij print de drie buren.
  2. Tel met een dictionary stemmen hoeveel buren elke soort heeft, en print stemmen.
  3. Zet k op 1, op 2 en op 7, en bekijk bij elke k de stemmen.
Python
Code-omgeving wordt voorbereid…
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.