2013-03-31 96 views
46

我試圖創建一個OrderedDict對象,但我創建它的時候,比元素都混亂。Python OrderedDict不保留元素順序

這是我做的:

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

的元素不停留在爲了我分配

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

docs.python.org沒有一個例子,我可以」弄清楚爲什麼命令混亂。任何幫助是極大的讚賞。

回答

85

你的問題是,你正在構建一個dict給初始數據爲OrderedDict - 這dict存儲中的任何命令,所以它獲取到OrderedDict之前的訂單丟失。

的解決方案是從有序的數據類型來構建 - 最簡單的是tuplelist 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])]) 

值得一提的是,這是爲什麼OrderedDict使用它爲它的語法的字符串表示 - 串表示應嘗試成爲有效的Python代碼以在可能的情況下重現對象,這就是爲什麼輸出使用元組列表而不是字典的原因。

+12

另外值得注意的是,將名稱/值傳遞給構造函數不足以設置順序。 (OrderedDict([one'= 1,two = 2,three = 3,four = 4)' 'OrderedDict([('four',4),('one ',1),('three',3),('two',2)])' –

+1

@EricSmith實際上,出於同樣的原因,Python中的變量關鍵字args(** kwargs)被存儲爲字典 - 當發生這種情況時,訂單就像以前一樣丟失。請注意,[PEP-468](http://legacy.python.org/dev/peps/pep-0468/)有一個簡單的解決方案 - 使用'OrderedDict'作爲'kwargs',而不是一個功能,但也許有一天。 –

+1

@GarethLatty現在在[python 3.6](https://docs.python.org/3/whatsnew/3.6.html#pep-468-preserving-keyword-argument-order)中實現了PEP-468 – Copperfield