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:
prioriteit aflopend;
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)geeftsorted(attempt_list, key=ranking_key)terug.Gebruik geen
reverse=True, omdat de twee tuplevelden verschillende richtingen gebruiken.Verander de oorspronkelijke lijst niet.