Seite 1 von 1

Liste nach zwei Werten unterschiedlicher Wichtigkeit sortier

Verfasst: Freitag 29. Januar 2010, 12:31
von microkernel
Hallo,
ich wollte mal fragen wie man eine Liste von Dicts nach zwei Werten mit unterschiedlicher Wichtigkeit sortiert. Also wenn ich jetzt eine Liste mit mehreren Dicts hätte die ungefähr so aussehen würde;

Code: Alles auswählen

liste = [{"similarity" : 20, "rank" : 9}, 
           {"similarity" : 40, "rank" : 1},
           {"similarity" : 40, "rank" : 8},
           {"similarity" : 30, "rank" : 5}]
...Will ich sie gerne so sortiert haben das sie am Ende so sortiert ist, sodas der höhste "similarity"-Wert am Anfang ist. "rank" sollte nur sekundär sein und im falle falls 2 "similarity" werte gleich sind den entscheidenen Wert spielen.
Das Resultat sollte dann so aussehen:

Code: Alles auswählen

liste = [{"similarity" : 40, "rank" : 8}, 
           {"similarity" : 40, "rank" : 1},
           {"similarity" : 30, "rank" : 5},
           {"similarity" : 20, "rank" : 9}]
Weiß jemand wie man das umsetzen könnte?

Lg
microkernel

Verfasst: Freitag 29. Januar 2010, 12:48
von Defnull

Code: Alles auswählen

liste.sort(key=lambda x: (x["similarity"], x["rank"]), reverse=True)

Verfasst: Freitag 29. Januar 2010, 12:48
von jbs
aus: http://wiki.python.org/moin/HowTo/Sorting

Code: Alles auswählen

>>> L = [('d', 2), ('a', 4), ('b', 3), ('c', 2)]
>>> sorted(L, key=lambda x:(x[1], x[0]))
[('c', 2), ('d', 2), ('b', 3), ('a', 4)]
zu spät :(

Verfasst: Freitag 29. Januar 2010, 13:38
von microkernel
Vielen Dank!

Verfasst: Freitag 29. Januar 2010, 14:10
von Zap
Ich wunder mich, itemgetter ist doch auch immer dabei ;)

Code: Alles auswählen

from operator import itemgetter
sorted(liste, key=itemgetter("similarity", "rank"), reverse=True)

Verfasst: Freitag 29. Januar 2010, 14:43
von Defnull
Zap hat geschrieben:Ich wunder mich, itemgetter ist doch auch immer dabei ;)

Code: Alles auswählen

from operator import itemgetter
sorted(liste, key=itemgetter("similarity", "rank"), reverse=True)
Hat das wirklich einen Mehrwert?

Verfasst: Freitag 29. Januar 2010, 14:50
von Zap
Nicht wirklich. Außer das ich ausprobieren wollte ob itemgetter mehrere parameter unterstützt. War mir da nicht mehr so 100%ig sicher.

An sich ist es aber das gleiche in grün...

Verfasst: Freitag 29. Januar 2010, 18:23
von Leonidas
Also ich finde die Variante mit ``itemgetter`` schöner als das ``lambda``.

Verfasst: Freitag 29. Januar 2010, 23:05
von BlackJack
Laufzeit könnte auch etwas besser sein. Müsste man aber nachmessen.