Seite 1 von 1

Zweites Argument beim Sortieren von Listen

Verfasst: Dienstag 10. Januar 2012, 21:26
von microkernel
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

Re: Zweites Argument beim Sortieren von Listen

Verfasst: Dienstag 10. Januar 2012, 21:31
von pillmuncher
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.

Re: Zweites Argument beim Sortieren von Listen

Verfasst: Dienstag 10. Januar 2012, 21:31
von nomnom
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. ;)

Re: Zweites Argument beim Sortieren von Listen

Verfasst: Dienstag 10. Januar 2012, 22:24
von /me
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.

Re: Zweites Argument beim Sortieren von Listen

Verfasst: Dienstag 10. Januar 2012, 23:20
von bords0
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")

Re: Zweites Argument beim Sortieren von Listen

Verfasst: Donnerstag 12. Januar 2012, 04:09
von Leonidas
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 ;)