2014-03-26 116 views
9

我有一個有序的字典,想更改個別順序。在下面的代碼示例中,我希望將項目3(人員)及其值移至位置2.因此,順序將是動物,人員,食物和飲料。我如何去解決他的問題?改變python中有序字典的順序

import collections 

queue = collections.OrderedDict() 

queue["animals"] = ["cat", "dog", "fish"] 
queue["food"] = ["cake", "cheese", "bread"] 
queue["people"] = ["john", "henry", "mike"] 
queue["drinks"] = ["water", "coke", "juice"] 

print queue 

回答

3

編輯:您可以編寫自定義函數(警告,這工作,但非常快速和骯髒的):

編輯:修正了當您試圖向前

import collections 

def move_element(odict, thekey, newpos): 
    odict[thekey] = odict.pop(thekey) 
    i = 0 
    for key, value in odict.items(): 
     if key != thekey and i >= newpos: 
      odict[key] = odict.pop(key) 
     i += 1 
    return odict 

queue = collections.OrderedDict() 

queue["animals"] = ["cat", "dog", "fish"] 
queue["food"] = ["cake", "cheese", "bread"] 
queue["people"] = ["john", "henry", "mike"] 
queue["drinks"] = ["water", "coke", "juice"] 
queue["cars"] = ["astra", "focus", "fiesta"] 

print queue 

queue = move_element(queue, "people", 1) 

print queue 
+0

我喜歡這種方法,但如果您嘗試將'people'移動到位置4,發送移動元素3,則不起作用。 – speedyrazor

+0

正確...我編輯了我的答案以檢查邊界條件。 – Selcuk

+0

如果我在隊列中添加更多項目,它會再次使用3打破。 – speedyrazor

8

OrderedDicts訂購者爲insertion order。所以你必須通過循環遍歷原始對象中的key:value對來構造一個新的OrderedDict。沒有OrderedDict方法可以幫助你。

因此,您可以創建一個tuple來表示keys的想法順序,然後重複該操作以創建一個新的OrderedDict

key_order = ('animal', 'people', 'food', 'drink') 
new_queue = OrderedDict() 
for k in key_order: 
    new_queue[key] = queue[key] 

或者更雄辯地

OrderedDict((k, queue[k]) for k in key_order) 
+0

它發生顯示名稱鍵未定義。 –

+0

@AbhishekBhatia - 修正了錯字 – geographika

1

我認爲你必須手工進行:

>>> keys = list(queue) 
>>> keys 
['animals', 'food', 'people', 'drinks'] 
>>> keys[1], keys[2] = keys[2], keys[1] 
>>> queue = collections.OrderedDict((key, queue[key]) for key in keys) 
>>> list(queue) 
['animals', 'people', 'food', 'drinks'] 
0

this question.

我不認爲你可以排序字典像你希望沒有明確重新定義的順序。