python中有序字典的顺序变化

python中有序字典的顺序变化,python,collections,ordereddictionary,Python,Collections,Ordereddictionary,我有一本已订购的词典,想更改单个的订购。在下面的代码示例中,我希望将项目3(人员)及其值移动到位置2。所以顺序是动物,人,食物,饮料。我该如何处理他的问题 import collections queue = collections.OrderedDict() queue["animals"] = ["cat", "dog", "fish"] queue["food"] = ["cake", "cheese", "bread"] queue["people"] = ["john", "hen

我有一本已订购的词典,想更改单个的订购。在下面的代码示例中,我希望将项目3(人员)及其值移动到位置2。所以顺序是动物,人,食物,饮料。我该如何处理他的问题

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

OrderedDicts
是按顺序排列的。因此,您必须通过循环原始对象中的
key:value
对来构造新的OrderedDict。没有任何
OrderedDict
方法可以帮助您

因此,您可以创建一个
元组
来表示
键的理想顺序
,然后对其进行迭代以创建一个新的
OrderedDict

key_order = ('animal', 'people', 'food', 'drink')
new_queue = OrderedDict()
for k in key_order:
    new_queue[k] = queue[k]
或者更雄辩地说

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

我认为您必须手动执行此操作:

>>> 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']


我认为如果不明确地重新定义顺序,你就无法像你希望的那样对字典进行排序

Edit:您可以编写自定义函数(警告,这可以工作,但速度很快且不干净):

编辑:修复了当您尝试前进时出现的错误


@阿披实-修复了typo@geographika第一个例子不是固定的。它应该是:对于键顺序中的k:new_queue[k]=queue[k]@dmitryvodiaryk-我只使用了这个雄辩的例子!另一个已经修好了。
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