0%

Objekte darstellen und vergleichen · Übung

Eine Ordnung nur festlegen, wenn sie passt

Hashing beantwortet, ob ein Wert in einem Set oder Dictionary gefunden werden kann. Eine Ordnung beantwortet eine andere Frage: Welcher von zwei Werten kommt zuerst?

sorted() braucht eine Ordnung, und < löst bei einer neuen Klasse standardmäßig eine Ausnahme aus:

class Points:
    def __init__(self, amount):
        self.amount = amount


sorted([Points(5), Points(1), Points(3)])

Eine natürliche Ordnung gehört zum Wert

Points hat eine unstrittige Ordnung: Drei Punkte sind weniger als fünf. Definiere __lt__, das Python für < und zum Sortieren verwendet:

Try it

Bei einem anderen Typ NotImplemented zurückzugeben erlaubt Python, es mit dem anderen Operanden zu versuchen und schließlich einen hilfreichen TypeError auszulösen.

Eine situationsabhängige Ordnung gehört zum Aufruf

Ein Question hat keine einzelne natürliche Ordnung. Ein Bericht möchte zuerst die Fragen mit den wenigsten Punkten, ein anderer möchte alphabetische Fragetexte. Keine dieser Reihenfolgen ist die dauerhafte Bedeutung von question_a < question_b.

Verwende eine Schlüsselfunktion an der Stelle, an der du sortierst:

Try it

Der Aufruf benennt, was diese bestimmte Reihenfolge bedeutet, und lässt anderen Aufrufern die Freiheit, anders zu entscheiden.

Ein Bericht soll Fragen von der niedrigsten bis zur höchsten Punktzahl auflisten. Welches Werkzeug passt besser?

Definiere __lt__ nur, wenn eine bestimmte Ordnung tatsächlich zur Bedeutung des Werts gehört. Andernfalls benenne die Reihenfolge ausdrücklich mit einem Schlüssel.

Die Übung setzt beide Entscheidungen um: Points erhält seine natürliche Ordnung. Question bleibt ohne eigene Ordnung, und eine Berichtsfunktion sortiert Fragen anhand ihrer Punkte.

Aufgabe

Ergänze nur die Ordnung, die tatsächlich zum jeweiligen Wert gehört.

Gib Points ein __lt__, das seinen Betrag vergleicht und bei einem anderen Typ NotImplemented zurückgibt. sorted() soll anschließend eine Liste von Points ohne Schlüssel sortieren.

Gib Question keine Ordnungsmethode. Schreibe by_points(questions), das mit einer Schlüsselfunktion eine neue Liste von der niedrigsten bis zur höchsten Punktzahl zurückgibt. Lass die ursprüngliche Liste unverändert.