Python OrderedDict-Iteration
Warum muss mein python-OrderedDict bekommen initialisiert 'out of order'?
Hier die Lösung ist weniger faszinierend als die Erklärung. Es gibt hier etwas, ich weiß nur nicht bekommen, und vielleicht ein expanation anderen helfen würde, so gut wie ich.
>>> from collections import OrderedDict
>>> spam = OrderedDict(s = (1, 2), p = (3, 4), a = (5, 6), m = (7, 8))
>>> spam
OrderedDict([('a', (5, 6)), ('p', (3, 4)), ('s', (1, 2)), ('m', (7, 8))])
>>> for key in spam.keys():
... print key
...
# this is 'ordered' but not the order I wanted....
a
p
s
m
# I was expecting (and wanting):
s
p
a
m
InformationsquelleAutor der Frage neil.millikin | 2013-05-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vom die docs:
Also Initialisierung verliert die Ordnung, weil es im Grunde ruft einen Konstruktor mit
**kwargs
.Edit: Im Sinne einer Lösung (nicht nur ein Erklärung)—wie bereits in einem Kommentar von der OPvorbei in eine Liste von Tupeln wird Arbeit:
Dies ist, weil es nur immer ein einziges argument, eine Liste.
InformationsquelleAutor der Antwort Chris Krycho
@Chris Krycho gab eine gute Erklärung, warum Dinge scheitern.
Wenn man sich die repr() eines OrderedDict, erhalten Sie einen Hinweis, wie Sie zu vermitteln, um von Anfang an: Sie brauchen, um eine Liste von (Schlüssel, Wert) - Paare beibehalten der Reihenfolge der Tasten durch die Liste.
Hier eine, von der ich früher war:
(Es ist einfach so passiert, dass in Python v3.3.0 Ihre original-Beispiel von
spam
hielt den Schlüssel in Ihrer ursprünglichen Reihenfolge, von Anfang an. Ich geändert, umspamher
zu bekommen arounf).InformationsquelleAutor der Antwort Paddy3118
Als andere Antworten erwähnt haben, versuchen, passieren ein dict zu OrderedDict oder mit keyword-Argumenten nicht beibehalten der Reihenfolge. Übergabe im Tupel ist, ist ein bisschen hässlich, aber, und das ist Python. Es sollte schön sein.
Können Sie
abverwenden__getitem__
auf eine Klasse, um dict-ähnliche syntax für die Erstellung von OrderedDict "Literale":Nun können Sie dict-ähnliche syntax zum erstellen einer OrderedDict:
Dies funktioniert, weil innerhalb der eckigen Klammern, Python erstellt Scheibe Literale, die zufällig so Aussehen dict-syntax wenn Sie schielen ein wenig.
Den
OD
Klasse davon profitieren könnten Fehler überprüfen, aber das zeigt, wie es funktionieren kann.InformationsquelleAutor der Antwort Cody Piersall