Liste nach zwei Werten unterschiedlicher Wichtigkeit sortier

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 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
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Code: Alles auswählen

liste.sort(key=lambda x: (x["similarity"], x["rank"]), reverse=True)
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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 :(
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

Vielen Dank!
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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)
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

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?
Bottle: Micro Web Framework + Development Blog
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Also ich finde die Variante mit ``itemgetter`` schöner als das ``lambda``.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Laufzeit könnte auch etwas besser sein. Müsste man aber nachmessen.
Antworten