0%

Gegevens bewerken en combineren · oefening

Sorteer records met een sleutel

De vorige les combineerde vraagteksten en ingevoerde antwoorden tot volledige pogingrecords. Zodra records bij elkaar horen, kan een programma ze ordenen zonder hun velden weer te scheiden.

In hoofdstuk 2 gaf je een benoemde functie aan sorted door om pogingen op één waarde te rangschikken:

def score_of(attempt):
    return attempt["score"]


ranked = sorted(attempts, key=score_of, reverse=True)

Die rangschikking laat een vraag open: wat moet er gebeuren wanneer twee cursisten dezelfde score hebben? We hebben een tweede regel nodig, zodat hogere scores eerst komen en bij gelijke scores de kortere tijd beslist.

Tuplesleutels geven prioriteiten aan

Python vergelijkt tuples van links naar rechts:

(1, 40) < (2, 10)

De eerste waarden bepalen deze vergelijking. Een latere waarde telt alleen wanneer eerdere waarden gelijk zijn.

Een sorteersleutel kan twee waarden teruggeven. Taken kunnen bijvoorbeeld eerst op hogere prioriteit en daarna op kortere duur worden geordend:

def task_key(task):
    return (-task["priority"], task["minutes"])

Sorteer daarna in de normale oplopende richting:

sorted(tasks, key=task_key)

De prioriteit negatief maken plaatst grotere prioriteiten vooraan, omdat -9 vóór -8 komt. Minuten blijven positief, dus kortere taken komen eerst wanneer de prioriteiten gelijk zijn. De oefening past dit patroon toe op scores en voltooiingstijden.

De tuple legt de prioriteit duidelijk vast:

  1. prioriteit aflopend;

  2. minuten oplopend.

Welk record komt eerst met de sleutel (-score, seconds)?

Implementeer een rangschikking met twee regels

Maak de sleutelfunctie en rangschikfunctie af. sorted moet een nieuwe lijst teruggeven en de bronvolgorde ongewijzigd laten.

Opdracht

Maak beide functies af.

  • ranking_key(attempt) geeft (-score, seconds) terug.

  • rank_attempts(attempt_list) geeft sorted(attempt_list, key=ranking_key) terug.

  • Gebruik geen reverse=True, omdat de twee tuplevelden verschillende richtingen gebruiken.

  • Verander de oorspronkelijke lijst niet.