Zweites Argument beim Sortieren von Listen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

Hallo,

ich habe folgendes Problem. Ich habe eine Liste von Objekten mit den Eigenschaften "dist" und "degree". Nun möchte ich diese Liste nach den geringsten "dist" Wert sortieren. Das mache ich wie üblich so:

Code: Alles auswählen

l.sort(key=lambda j: j.dist)
Wenn aber nun die "dist" Werte von zwei Objekten gleich ist, soll das Objekt höher platziert werden, welches den höhere "degree" Wert hat.

Nun lautet meine Frage, wie ich das umsetzten kann(?)


Viele Grüße,
microkernel
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

zB. so:

Code: Alles auswählen

l.sort(key=lambda j: (j.dist, j.degree))
oder so:

Code: Alles auswählen

l.sort(key=lambda j: (j.dist, -j.degree))
je nachdem, was "höher platziert" bedeutet.
In specifications, Murphy's Law supersedes Ohm's.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Mit dem `cmp`-Argument von list.sort. :)

Code: Alles auswählen

>>> a = [(1,3),(1,2)]
>>> a.sort(cmp=lambda x, y: 1 if x[0] > y[0] else 1 if x[0] == y[0] and x[1] > y[1] else 0 if x == y else -1)
>>> a
[(1, 2), (1, 3)]
>>> 
Edit: Pillmunchers Lösung ist besser. ;)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

nomnom hat geschrieben:Mit dem `cmp`-Argument von list.sort. :)
Bitte nicht cmp, denn das muss bei jedem Vergleich der für die Sortierung notwendig ist ausgewertet werden. key wird nur einmal ermittelt. Python 3.x kennt cmp auch gar nicht mehr als möglichen Keyword-Parameter.
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

microkernel hat geschrieben:Ich habe eine Liste von Objekten mit den Eigenschaften "dist" und "degree". Nun möchte ich diese Liste nach den geringsten "dist" Wert sortieren. Das mache ich wie üblich so:

Code: Alles auswählen

l.sort(key=lambda j: j.dist)
Wenn aber nun die "dist" Werte von zwei Objekten gleich ist, soll das Objekt höher platziert werden, welches den höhere "degree" Wert hat.
Klassische Aufgabe für attrgetter. Ungetestet:

Code: Alles auswählen

key=operator.attrgetter("dist", "degree")
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Wollt schon sagen warum keiner den offensichtlichen weg über ``attrgetter`` vorschlägt. Dachte schon das wär ein Thread wo es um die obskurste Lösung geht, problembär-Style ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten