dic sorted by reversed values AND alphabetical keys

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
RedSharky
User
Beiträge: 99
Registriert: Donnerstag 13. April 2006, 15:38

Hallo Leute,

ich möchte eine Dictionary so sortieren, dass die Values in "reversed order" (höchster zuerst) sortiert werden und gleichzeitig aber die Keys alphabetisch sortiert werden (wenn Values gleich sind). Beispiel:

Code: Alles auswählen

#!/usr/bin/python

from operator import itemgetter

a_dic = {"e" : 5, "c" : 3, "a" : 1, "b": 3, "d" : 3}
for k,v in sorted( a_dic.items(), key=itemgetter(1), reverse=True ):
    print k,v

#Current output (not what I want):
#e 5
#c 3
#b 3
#d 3
#a 1

# Task: sort by:
# 1. values in reversed order (highest value first)
# 2. AND by keys in aplphabetical order for same value
# Required output:
#e 5
#b 3
#c 3
#d 3
#a 1
Wie könnte man das machen?

Danke schonmal!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Du musst den Schlüssel ein wenig umstellen:

Code: Alles auswählen

>>> a_dic = {"e" : 5, "c" : 3, "a" : 1, "b": 3, "d" : 3}
>>> sorted(a_dic.items(), key=lambda x: (-x[1], x[0]))
[('e', 5), ('b', 3), ('c', 3), ('d', 3), ('a', 1)]
Bei Python 2.x hast du noch ein cmp-Argument, damit geht es übersichtlicher. Ansonsten ist auch ein Blick in die Dokumentation zur sorted-Funktion sehr interessant.
Zuletzt geändert von EyDu am Donnerstag 21. Februar 2013, 15:25, insgesamt 1-mal geändert.
Das Leben ist wie ein Tennisball.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

RedSharky hat geschrieben:ich möchte eine Dictionary so sortieren, dass die Values in "reversed order" (höchster zuerst) sortiert werden und gleichzeitig aber die Keys alphabetisch sortiert werden (wenn Values gleich sind).
Zitat aus der Dokumentation zu dict: "Keys and values are listed in an arbitrary order which is non-random, varies across Python implementations, and depends on the dictionary’s history of insertions and deletions."

Du müsstest also ein OrderedDict verwenden.

Code: Alles auswählen

from collections import OrderedDict
a_dic = {"e" : 5, "c" : 3, "a" : 1, "b": 3, "d" : 3}
foo = OrderedDict(sorted(a_dic.items(), key=lambda x: (-x[1], x[0])))
Zuletzt geändert von /me am Donnerstag 21. Februar 2013, 15:29, insgesamt 1-mal geändert.
BlackJack

@/me: Du hast nur die Überschrift gelesen, oder? ;-)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

BlackJack hat geschrieben:@/me: Du hast nur die Überschrift gelesen, oder? ;-)
Nee, ich habe auch den Text "ich möchte eine Dictionary so sortieren" gelesen. Das ist etwas anderes als "Ich möchte die Inhalte eines Dictionaries wie folgt sortiert ausgeben".
RedSharky
User
Beiträge: 99
Registriert: Donnerstag 13. April 2006, 15:38

Cool, es klappt.
Thnx!!! :D
Antworten