2015-12-16 42 views
5

我想獲得一個已排序的字典。但mydictorddict之間的項目順序似乎沒有改變。字典和python中的ordereddict之間的區別

from collections import OrderedDict 

mydict = {'a':1,'b':2,'c':3,'d':4} 

orddict = OrderedDict(mydict) 

print(mydict,orddict) 

# print items in mydict: 
print('mydict') 
for k,v in mydict.items(): 
    print(k,v) 

print('ordereddict') 
# print items in ordered dictionary 
for k,v in orddict.items(): 
    print(k,v) 


# print the dictionary keys 
# for key in mydict.keys(): 
#  print(key) 


# print the dictionary values 
# for value in mydict.values(): 
#  print(value) 
+4

當你構建一個* dict *時,這個順序是* not *存儲的。因此,從字典中創建OrderedDict的順序與創建* dict *的順序相同。 – Maroun

回答

9

OrderedDict保留訂單元素插入:

>>> od = OrderedDict() 
>>> od['c'] = 1 
>>> od['b'] = 2 
>>> od['a'] = 3 
>>> od.items() 
[('c', 1), ('b', 2), ('a', 3)] 
>>> d = {} 
>>> d['c'] = 1 
>>> d['b'] = 2 
>>> d['a'] = 3 
>>> d.items() 
[('a', 3), ('c', 1), ('b', 2)] 

因此,一個OrderedDict爲了的元素對你來說,它保留你給它的順序。

如果你想「排序」一本字典,你可能想

>>> sorted(d.items()) 
[('a', 1), ('b', 2), ('c', 3)] 
+2

爲了將一個'dict'轉換成'OrderedDict'(最初)按照排序順序排列,你應該這樣做:'od = OrderedDict(sorted(d.items()))'。 – ShadowRanger

2

有序詞典就像是普通的字典,但他們記住的項目插入的順序。在迭代有序字典時,將按照首次添加密鑰的順序返回項目。

所以只能通過各種添加到字典的順序

您可以通過按鍵如下建立一個OrderedDict順序,

orddict = OrderedDict(sorted(mydict.items(), key = lambda t: t[0]))

或簡稱爲@ShadowRanger評論中提到

orddict = OrderedDict(sorted(d.items()))

如果你想通過價值秩序,8.3.5.1. OrderedDict Examples and Recipes

2

添加到由Brian答案

orddict = OrderedDict(sorted(mydict.items(), key = lambda t: t[1]))

更多信息,OrderedDict真的很棒。這裏的原因:

  • 可以,因爲它支持平等與其他Mapping對象,如collections.counter測試使用它作爲簡單dict對象。

  • OrderedDict保留了Brian所解釋的插入順序。除此之外,它還有一個方法popitem,它以LIFO順序返回(鍵,值)對。所以,你也可以用它作爲映射的「堆棧」。

你不僅得到dict而且,一些很酷的技巧的全部功能。