PyDay: Die listige Python (2)

Letzte Woche beschrieb ich ein Problem, heute nun die Lösung. Oder hast du es bereits selbst herausgefunden?

Wir erinnern uns: Es ging um die Sortierung einer Kundenliste nach Umsätzen. Dazu hatte ich eine einfache Klasse entworfen, die den Namen und den aktuellen Umsatz des Kunden enthält. Das Problem war nun, dass Klassenobjekte nicht sortierbar sind, weil deren Reihenfolge nicht definiert ist.

Ich dachte zunächst, mir mit einem simplen (aber genialen!) Trick helfen zu können. Ergänze ich die folgende Methode in der Klasse, …

def __str__(self):
    return self._name

… dann wird dieses möglich (Zeile 7):

kunde1 = Kunde('Müller', 69000)
kunde2 = Kunde('Meier', 42000)
kunde3 = Kunde('Schulze', 23000)
 
print(kunde1, kunde2, kunde3)

Leider funktioniert das nicht mit der sort-Funktion. Daher nun der andere Trick, der auf jeden Fall funktioniert. Wir brauchen dazu eine zusätzliche Funktion, die eine solche Klasse wie oben übergeben bekommt und den Umsatz als Rückgabewert liefert:

def umsatz_von_kunde(kunde):
    return kunde.umsatz()

Nun können wir nach Instanzierung der drei Kunden die Liste zusammensetzen (Zeile 10), probeweise ausgeben (12-14), sortieren lassen (16) und noch einmal ausgeben (ab 17):

kundenliste = [kunde1, kunde2, kunde3]
 
print('Vor der Sortierung:')
for kunde in kundenliste:
    print ('   {0}: {1}'.format(kunde.name(), kunde.umsatz()))
 
kundenliste.sort(key=umsatz_von_kunde)
print('Nach der Sortierung:')
for kunde in kundenliste:
    print ('   {0}: {1}'.format(kunde.name(), kunde.umsatz()))

In Zeile 16 erhält die Sort-Methode mit dem benannten Parameter „key“ die Referenz auf die Funktion, die den für die Sortierung verwendeten Wert liefert. Kleine Änderung, große Wirkung! Genial, oder?


SmallInvoice Logo

Ähnliche Artikel:

AuthorChristoph Jüngling

Selbständiger Softwareentwickler und Seminarleiter

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

20 − vier =