Reihenfolge der Werte beim Iterieren über ein Dictionary

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
stesind
User
Beiträge: 11
Registriert: Dienstag 30. Juni 2009, 06:32

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
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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.
[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]
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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
Das Leben ist wie ein Tennisball.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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, [...]"
stesind
User
Beiträge: 11
Registriert: Dienstag 30. Juni 2009, 06:32

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
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

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
stesind
User
Beiträge: 11
Registriert: Dienstag 30. Juni 2009, 06:32

Nur um noch mal klarzustellen, bei mir wird das dic absteigend sortiert ausgegeben!

Deshalb die ursprüngliche Frage.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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'}
Das Leben ist wie ein Tennisball.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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).
Antworten