在Python中更改有序字典的顺序

15 投票
3 回答
28293 浏览
提问于 2025-04-17 23:59

我有一个有序字典,想要改变里面的顺序。在下面的代码示例中,我想把第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

3 个回答

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

OrderedDicts 是按照你放入的顺序来排序的。也就是说,如果你想要重新排列一个 OrderedDict,你需要通过遍历原始对象中的 key:value 对来构建一个新的 OrderedDict。没有任何 OrderedDict 的方法可以直接帮你做到这一点。

所以,你可以创建一个 tuple 来表示 keys 的理想顺序,然后根据这个顺序来创建一个新的 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)
7

你可以写一个自定义的函数(注意,这个方法有效,但非常简单粗暴):

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

撰写回答