ubuntuusers.de

Python dict nach Values sortieren

Status: Gelöst | Ubuntu-Version: Ubuntu 8.10 (Intrepid Ibex)
Antworten |

Arubeto

Anmeldungsdatum:
4. Dezember 2007

Beiträge: 384

Moin,

ich möchte ein dict in Python nach seinen Values sortieren, geht so etwas? Die Values sind Objekte eines komplexen, selbst definierten Datentyps, für die ich eine compare-Methode implementiert habe. Listen von Objekten dieses komplexen Datentypes kann ich also schon sortieren. Ich habe die Elemente jedoch in einem Dictionary und möchte sie auch darin behalten. Jetzt habe ich folgendes probiert (im Beispiel mit ints statt Objekten des selbstdefinierten Datentyps):

from operator import itemgetter

dict1 = {'a': 1, 'b': 4, 'c': 35, 'z': 2}
dict2 = sorted(dict1.items(), key = itemgetter(1))

Zwar ist dict2 dann sortiert, aber leider nicht mehr vom Typ dictionary, sondern nur noch eine Liste. Deshalb habe ich es dann wieder zu dict getypecastet:

dict3 = dict(dict2)

Dict3 ist dann zwar wieder ein dictionary, aber wieder nach den keys sortiert. Gibt es überhaupt eine Möglichkeit, ein Dictionary nicht nach seinen Keys sondern nach seinen Values zu sortieren? Danke!

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

Ein Wörterbuch ist nicht sortiert, weder nach Schlüsseln noch nach Werten.

Arubeto

(Themenstarter)

Anmeldungsdatum:
4. Dezember 2007

Beiträge: 384

Anscheinend ja doch. Oder warum ändert es die Reihenfolge der Elemente sonst?

Anders ausgedrückt:

dict([('a', 1), ('z', 2), ('b', 4), ('c', 35)])

führt nicht zu

{'a': 1, 'z': 2, 'b': 4, 'c': 35}

sondern zu

{'a': 1, 'b': 4, 'c': 35, 'z': 2}

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Arubeto

(Themenstarter)

Anmeldungsdatum:
4. Dezember 2007

Beiträge: 384

Ok, danke.

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

@arubeto: Ein Wörterbuch ist nicht sortiert:

1
2
>>> list(dict([('a', 1), ('z', 2), ('b', 4), ('c', 35)]))
['a', 'c', 'z', 'b']

Die Dokumentation dict.items() sagt dazu:

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.

Was du gezeigt hast, war die Darstellung eines Wörterbuchs über dessen __repr__()-Methode, die über die Interna eines Wörterbuchs nicht im Geringsten Aufschluss gibt.

Arubeto

(Themenstarter)

Anmeldungsdatum:
4. Dezember 2007

Beiträge: 384

Ok. Habe gerade gelesen, dass sortierbare Dictionaries in Python 3.1 eingeführt werden, aber inzwischen habe ich es anders hinbekommen.

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

Python 3.1 hat keine sortierbaren Wörterbücher. Die OrderedDict-Klasse aus PEP 372 ermöglicht lediglich die Iteration über Schlüssel in der Reihenfolge des Einfügens. Unter "Questions and Answers" heißt es in der Antwort auf die Frage "Does OrderedDict support alternate sort orders such as alphabetical?" dann auch:

No. [...] The OrderedDict is all about recording insertion order. If any other order is of interest, then another structure (like an in-memory dbm) is likely a better fit.

Antworten |