Ga naar hoofdinhoud

Bouw zelf — vind ook de index van het maximum

Leerdoel: je past het patroon aan om niet alleen de waarde, maar ook de positie terug te geven.

Opdracht

Schrijf vind_index_van_maximum(lijst) die de index teruggeeft van het maximum. Staat het maximum er meerdere keren, geef dan de eerste index.

  • vind_index_van_maximum([3, 7, 2, 9, 4])3
  • vind_index_van_maximum([10, 20, 20, 10])1 (eerste 20)
  • vind_index_van_maximum([42])0

De startcode roept je functie aan op vier lijsten en print de gevonden index naast wat het moet zijn.

Python
Code-omgeving wordt voorbereid…
Tip

Zelfde patroon als vind_maximum, maar nu houd je een index bij in plaats van een waarde. Vergelijken doe je via lijst[max_index].

Welke startwaarde kies je voor max_index? Welke variabele update je bij een nieuwe winnaar?

Loop door de lijst met enumerate (ken je uit lineair zoeken, bouwsteen 1) zodat je in elke ronde zowel de huidige index als de huidige waarde hebt.

Antwoord
def vind_index_van_maximum(lijst):
max_index = 0
for i, waarde in enumerate(lijst):
if waarde > lijst[max_index]:
max_index = i
return max_index

print(vind_index_van_maximum([3, 7, 2, 9, 4])) # 3
print(vind_index_van_maximum([10, 20, 20, 10])) # 1
print(vind_index_van_maximum([42])) # 0

Waarom > en niet >=?

  • Met > blijft bij gelijke waardes de eerste index staan.
  • Met >= wordt het de laatste.

Beide zijn geldige keuzes — kies bewust.

Onderzoek

Wat als alle elementen gelijk zijn? Welke index krijg je terug?

Bijvoorbeeld vind_index_van_maximum([7, 7, 7, 7]). Probeer het in de code-omgeving hierboven.

Met de >-versie krijg je 0 terug — de eerste 7 wint, want geen latere waarde is strikt groter. Met >= zou je 3 krijgen, de laatste dus.

Geen van beide is fout; het is een ontwerpkeuze. Bij gelijke waardes, welke positie tel je als de winnaar? In de praktijk kies je meestal de eerste, want dat is voorspelbaarder en past bij hoe lineair zoeken werkt.

Uitdaging (optioneel)

Schrijf vind_alle_indexen_van_maximum(lijst) die een lijst van alle indexen returnt waar het maximum staat. Bijv. [5, 3, 5, 2, 5][0, 2, 4].

Tip

Twee rondes door de lijst. In de eerste ronde vind je het maximum zelf, precies zoals vind_maximum. In de tweede ronde loop je opnieuw langs alle elementen en bewaar je elke index waar de waarde gelijk is aan dat maximum.

Antwoord
def vind_alle_indexen_van_maximum(lijst):
maximum = lijst[0]
for waarde in lijst:
if waarde > maximum:
maximum = waarde
indexen = []
for i, waarde in enumerate(lijst):
if waarde == maximum:
indexen.append(i)
return indexen

print(vind_alle_indexen_van_maximum([5, 3, 5, 2, 5])) # [0, 2, 4]
print(vind_alle_indexen_van_maximum([1, 2, 3])) # [2]

Het kan niet in één ronde: pas als je de hele lijst hebt gezien weet je wat het maximum is, en dus welke eerdere indexen meetellen.

Door naar veelgemaakte fouten.