Seite 1 von 1

Reihenfolge der Werte beim Iterieren über ein Dictionary

Verfasst: Mittwoch 9. Dezember 2009, 11:43
von stesind
Mein dictionary sieht so aus:

dic['1'] = {'key1': value1, 'key1': value2}
dic['2'] = {'key1':value12, 'key2': value22}

...

Wenn ich jetzt darüber iteriere:

for item in dic:
print(item)


Wird die Liste absteigend herum ausgegeben:

47, 46, 45...

Obwohl ich in der aufsteigenden Reihenfolge 1, 2, 3 hinzugefügt habe. Das selbe tritt auch bei "for item in dic.keys()" auf. Verwende ich eine Liste, wird aufsteigend ausgegeben. Was ich möchte.

Was ist der Grund für die absteigende Reihenfolge?

Ich dachte dictionaries werden immer in der Reihenfolge ausgegeben, in der sie abgelegt worden.

Ich verwende momentan diesen Workaround:

list = dic.keys()
list.sort()
for item in list
print dic[item]


Das funktioniert dann aufsteigend.

Danke,

Steffen

Verfasst: Mittwoch 9. Dezember 2009, 11:52
von jbs
Dictionarys speichern nicht die Reihenfolge, sondern werten nur Keys -> Values aus.

Was du suchst ist das OrderedDict, das ab 2.7 oder 3.x verfügbar ist. Alternativ kannst du auch eine andere Implementierung aus dem Internet nutzen.

Verfasst: Mittwoch 9. Dezember 2009, 11:53
von EyDu
Hallo!

Die Reihenfolge der Schlüssel ist beliebig, daher kannst du dich nicht darauf verlassen, dass sie in irgend einer bestimmten Reihenfolge übergeben werden.

Schau dir mal http://docs.python.org/dev/library/coll ... rderedDict an, das sollte dir weiterhelfen.

Sebastian

Re: Reihenfolge der Werte beim Iterieren über ein Dictionary

Verfasst: Mittwoch 9. Dezember 2009, 12:09
von /me
stesind hat geschrieben:Ich dachte dictionaries werden immer in der Reihenfolge ausgegeben, in der sie abgelegt worden.
Hier hilft dann die Konsultation der Dokumentation. Unter http://docs.python.org/tutorial/datastr ... ctionaries findest du den Satz: "It is best to think of a dictionary as an unordered set of key: value pairs, [...]"

Verfasst: Mittwoch 9. Dezember 2009, 12:31
von stesind
Danke für die schnellen Antworten!

Das ein dic nicht sortiert ist, ist schon klar. Mir reicht ja ein Verhalten wie ein Stack/Listen. Also last in last out.

Gegenwärtig werden bei mir die Werte ja lifo ausgegeben. Also genau anders herum.

Scheint, ich muss bei meinem Workaround bleiben.

Danke,

Steffen

Verfasst: Mittwoch 9. Dezember 2009, 12:53
von HWK
stesind hat geschrieben:Das ein dic nicht sortiert ist, ist schon klar.
Offensichtlich nicht. Wie bereits gesagt, bedeutet "nicht sortiert" hier, dass die Daten völlig unabhängig von der Reihenfolge des Schreibens gespeichert werden. Insofern ist auch die Reihenfolge beim Auslesen nicht definiert.
MfG
HWK

Verfasst: Mittwoch 9. Dezember 2009, 13:20
von stesind
Nur um noch mal klarzustellen, bei mir wird das dic absteigend sortiert ausgegeben!

Deshalb die ursprüngliche Frage.

Verfasst: Mittwoch 9. Dezember 2009, 13:22
von Hyperion
stesind hat geschrieben:Nur um noch mal klarzustellen, bei mir wird das dic absteigend sortiert ausgegeben!
Das ist aber reiner "Zufall", d.h. Du kannst dieses Verhalten nicht bei allen Python Implementierungen voraussetzen.

Verfasst: Mittwoch 9. Dezember 2009, 13:47
von EyDu
Oder einfach mal ein Gegenbeispiel zu deiner These:

Code: Alles auswählen

>>> dict(zip("abcdefg", "abcdefg"))
{'a': 'a', 'c': 'c', 'b': 'b', 'e': 'e', 'd': 'd', 'g': 'g', 'f': 'f'}

Verfasst: Mittwoch 9. Dezember 2009, 16:33
von ms4py
stesind hat geschrieben:Das ein dic nicht sortiert ist, ist schon klar. Mir reicht ja ein Verhalten wie ein Stack/Listen. Also last in last out.
Warum verwendest du dann überhaupt ein dict? Wenn du nur ein Stack-Verhalten benötigst, reicht doch eine Liste (oder performanter gibt es noch collections.deque).