如何基于数组重新排序Python有序字典?

13

假设我有一个Ordered Dict,其中包含以下项目:

mydict = {'Rust': {'definition':'rusts definition'}, 'Iron': {'definition:'iron definition'}, 'Pyrite': {'definition':'pyrite definition'}}

如果我有一个数组:

myorder = ['Pyrite', 'Rust', 'Iron']
如何重新排列有序字典(Ordered Dict),以使其中的项目按照给定顺序进行排序?

8
为什么你想这么做?你可以简单地按照“myorder”中的顺序请求钥匙。 - Burhan Khalid
2
字典没有顺序。您的意思是按照顺序将它们提取到数组中吗?(基本上,不能依赖字典的顺序,因为不会采取任何措施保持字典的相同顺序。) - Brigand
3
Python3 新增了 OrderedDict - 我猜这就是他的意思。 - thegrinner
除非mydict是一个有序字典,否则它看起来会像这样:OrderedDict([('Rust',{'definition':'rusts definition'}),('Iron',{'definition':'iron definition'}),('Pyrite',{'definition':'pyrite definition'})])。问题中显示的只是一个常规(无序)dict - martineau
2个回答

17

试一试:

mydict = {'Rust': {'definition':'rusts definition'},
          'Iron': {'definition':'iron definition'},
          'Pyrite': {'definition':'pyrite definition'}}

myorder = ['Pyrite', 'Rust', 'Iron']

from collections import OrderedDict

ordered = OrderedDict()
for k in myorder:
    ordered[k] = mydict[k]

甚至更短:

ordered = OrderedDict((k, mydict[k]) for k in myorder)

使用上面的代码片段,ordered 将包含与 mydict 相同的键/值对,但它们将按照 myorder 指定的顺序插入。这就是使用 OrderedDict 的优点:在迭代时,它会保留插入顺序。

无法原地对现有字典进行排序(好吧,您可以提取所有键 - 值对,将它们消除并以正确的顺序再次添加,但这不是我们想要的),必须创建一个新字典...或者按指定的顺序迭代现有字典:

for k in myorder:
    x = mydict[k] # do something with x

1
你可以缩短代码,使用ordered = OrderedDict((k, mydict[k]) for k in myorder) - filmor
@filmor 很好!我已经按照你的建议更新了我的答案。谢谢! - Óscar López

-2
如果您想按照那个顺序使用它们,您可以这样做,例如。
for key in myorder:
    value = mydict[key]
    print value

输出:

{'definition': 'pyrite definition'}
{'definition': 'rusts definition'}
{'definition': 'iron definiti

它不会产生具有相同内容但顺序不同的字典。 - Eric

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