在嵌套字典中保持输入顺序

Keep input order in nested dictionaries

如何保留嵌套字典的输入顺序?具体来说:我使用另一个字典使其成为有序字典的嵌套字典(命名为 'outdict'),然后添加新键。

示例数据:

example1 = {'x': '28', 'y': 9,'z': '1999'}
example2 = {'x': '12', 'y': 15,'z': '2000'}
test1 = "abc"
test2 = "def"

我想要的'outdict'形式是

{'one': {'x': '28', 'y': 9,'z': '1999', 'alpha': 'abc'},
 'two': {'x': '12', 'y': 15,'z': '2000', 'alpha': 'def'}}

我尝试了两件事:

1.

from collections import OrderedDict

class MyDict(OrderedDict):
    def __missing__(self, key):
        val = self[key] = MyDict()
        return val

outdict = MyDict()
outdict["one"].update(OrderedDict(example1))
outdict["one"]["alpha"] = test1
outdict["two"].update(OrderedDict(example2))
outdict["two"]["alpha"] = test2

(来自 ) 结果:未排序

2.

outdict = OrderedDict()
outdict["one"] = OrderedDict()
outdict["two"] = OrderedDict()
outdict["one"].update(OrderedDict(example1))
outdict["one"]["alpha"] = test1
outdict["two"].update(OrderedDict(example2))
outdict["two"]["alpha"] = test2

结果:未排序

您不能只采用常规字典并将其包装在 OrderedDict() 中。这不会恢复值的顺序。您需要从一开始就使用有序的字典。示例:

本来我们有...

>>> example1 = {'x':'28','y':'9','z':'1999'}
>>> example1
{'y': '9', 'x': '28', 'z': '1999'}

现在使用 OrderedDict()

>>> from collections import OrderedDict
>>> example2 = OrderedDict()
>>> example2['x']=28
>>> example2['y']=9
>>> example2['z']=1999
>>> example2
OrderedDict([('x', 28), ('y', 9), ('z', 1999)])

将常规无序字典的内容放入有序字典中不会神奇地恢复无序字典中值的顺序。

不过,您可以做一些事情:

  1. 也将 example1 创建为 OrderedDict,因此它的值是有序的;但是将项目作为列表而不是字典传递,否则它们将在有序字典 'arrive' 之前再次无序

    example1 = OrderedDict([('x', '28'), ('y', 9), ('z', '1999')])
    
  2. 如果您希望值按字母顺序排序,而不必按它们添加的顺序排序,您可以对项目进行排序并从中创建一个新的 OrderedDict...

    example1 = OrderedDict(sorted(example1.items()))
    
  3. ...或跳过该步骤并直接使用排序的项目更新外部字典

    outdict["one"].update(sorted(example1.items()))