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

15
我有一个有序字典,想要更改其中的顺序。在下面的代码示例中,我想将第三个项目(people)及其值移动到第二个位置。因此,顺序将变为动物,人,食物,饮料。我该怎么做?
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

请参见此问题。我认为你无法像你希望的那样对字典进行排序,除非显式地重新定义顺序。 - bveb333
3个回答

21
"OrderedDicts" 按照插入顺序排序。因此,您需要通过循环遍历原始对象中的 "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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接