Seite 1 von 1

dic sorted by reversed values AND alphabetical keys

Verfasst: Donnerstag 21. Februar 2013, 15:14
von RedSharky
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!

Re: dic sorted by reversed values AND alphabetical keys

Verfasst: Donnerstag 21. Februar 2013, 15:22
von EyDu
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.

Re: dic sorted by reversed values AND alphabetical keys

Verfasst: Donnerstag 21. Februar 2013, 15:25
von /me
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])))

Re: dic sorted by reversed values AND alphabetical keys

Verfasst: Donnerstag 21. Februar 2013, 15:26
von BlackJack
@/me: Du hast nur die Überschrift gelesen, oder? ;-)

Re: dic sorted by reversed values AND alphabetical keys

Verfasst: Donnerstag 21. Februar 2013, 15:30
von /me
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".

Re: dic sorted by reversed values AND alphabetical keys

Verfasst: Donnerstag 21. Februar 2013, 15:31
von RedSharky
Cool, es klappt.
Thnx!!! :D