Daten umformen und verbinden · Übung
Sortiere Datensätze mit einem Schlüssel
Die vorige Lektion hat Fragetexte und eingegebene Antworten zu vollständigen Versuchsdatensätzen verbunden. Sobald Datensätze zusammengehören, kann ein Programm sie ordnen, ohne ihre Felder wieder zu trennen.
In Kapitel 2 hast du eine benannte Funktion an sorted übergeben, um Versuche nach einem Wert zu ordnen:
def score_of(attempt):
return attempt["score"]
ranked = sorted(attempts, key=score_of, reverse=True)
Diese Rangfolge lässt eine Frage offen: Was soll passieren, wenn zwei Lernende dieselbe Punktzahl haben? Wir brauchen eine zweite Regel, damit höhere Punktzahlen zuerst kommen und bei gleicher Punktzahl die kürzere Zeit entscheidet.
Tupelschlüssel geben Prioritäten vor
Python vergleicht Tupel von links nach rechts:
(1, 40) < (2, 10)
Die ersten Werte entscheiden diesen Vergleich. Ein späterer Wert zählt nur, wenn frühere Werte gleich sind.
Ein Sortierschlüssel kann zwei Werte zurückgeben. Zum Beispiel lassen sich Aufgaben zuerst nach höherer Priorität und dann nach kürzerer Dauer ordnen:
def task_key(task):
return (-task["priority"], task["minutes"])
Sortiere dann in der normalen aufsteigenden Richtung:
sorted(tasks, key=task_key)
Das Negieren der Priorität setzt größere Prioritäten nach vorn, weil -9 vor -8 kommt. Die Minuten bleiben positiv, sodass bei gleicher Priorität kürzere Aufgaben zuerst kommen. Die Übung überträgt dieses Muster auf Punktzahlen und Bearbeitungszeiten.
Das Tupel nennt die Priorität eindeutig:
Priorität absteigend;
Minuten aufsteigend.
Welcher Datensatz kommt mit dem Schlüssel (-score, seconds) zuerst?
Implementiere eine Rangfolge mit zwei Regeln
Vervollständige die Schlüssel- und Sortierfunktionen. sorted muss eine neue Liste zurückgeben und die ursprüngliche Reihenfolge unverändert lassen.
Aufgabe
Vervollständige beide Funktionen.
ranking_key(attempt)gibt(-score, seconds)zurück.rank_attempts(attempt_list)gibtsorted(attempt_list, key=ranking_key)zurück.Verwende nicht
reverse=True, weil die beiden Tupelfelder unterschiedliche Richtungen verwenden.Verändere die ursprüngliche Liste nicht.