2013-03-31 2 views
46

Ich versuche, ein OrderedDict-Objekt zu erstellen, aber sobald ich es erstelle, als die Elemente alle durcheinander sind.Python OrderedDict nicht halten Element Reihenfolge

Das ist, was ich tue:

from collections import OrderedDict 
od = OrderedDict({(0,0):[2],(0,1):[1,9],(0,2):[1,5,9]}) 

Die Elemente in der Reihenfolge bleiben nicht ich zuweisen

od 
OrderedDict([((0, 1), [1, 9]), ((0, 0), [2]), ((0, 2), [1, 5, 9])]) 

docs.python.org nicht ein Beispiel, und ich kann‘ Ich finde heraus, warum die Bestellung durcheinander gebracht wird. Jede Hilfe wird sehr geschätzt.

Antwort

85

Ihr Problem ist, dass Sie eine dict bauen die ersten Daten an die OrderedDict zu geben - das dictnicht Speicher beliebiger Reihenfolge, so dass der Auftrag verloren, bevor es an die OrderedDict bekommt.

Die Lösung ist aus einem geordneten Datentyp zu bauen - die einfachste ist ein list von tuple s:

>>> from collections import OrderedDict 
>>> od = OrderedDict([((0, 0), [2]), ((0, 1), [1, 9]), ((0, 2), [1, 5, 9])]) 
>>> od 
OrderedDict([((0, 0), [2]), ((0, 1), [1, 9]), ((0, 2), [1, 5, 9])]) 

Es ist erwähnenswert, dass aus diesem Grunde OrderedDict die Syntax verwendet es für sie tut ist String-Darstellung - Zeichenfolge Repräsentationen sollten versuchen, ein gültiger Python-Code zu sein, um das Objekt möglichst zu reproduzieren, und deshalb verwendet die Ausgabe eine Liste von Tupeln anstelle eines Diktats.

+12

Beachten Sie auch, dass das Übergeben von Namen/Werten an den Konstruktor nicht ausreicht, um die Reihenfolge festzulegen. '>>> aus Sammlungen importieren OrderedDict' ' >>> OrderedDict (eins = 1, zwei = 2, drei = 3, vier = 4) ' ' OrderedDict ([(vier ', 4), (' one ', 1), (' drei ', 3), (' zwei ', 2)]) ' –

+1

@EricSmith In der Tat werden variable Schlüsselworte (' ** kwargs') aus Python als Wörterbuch gespeichert - Wenn das passiert, ist die Reihenfolge wie vorher verloren. Beachten Sie, dass [PEP-468] (http://legacy.python.org/dev/peps/pep-0468/) eine einfache Lösung dafür bietet - verwenden Sie ein 'OrderedDict' für' kwargs', noch keine Funktion, aber Vielleicht eines Tages. –

+1

@GarethLatty jetzt in [Python 3.6] (https://docs.python.org/3/whatsnew/3.6.html#pep-468-reserving-keyword-argument-order) implementiert sie PEP-468 – Copperfield