【问题标题】:How to make a dictionary nested in a nested dictionary an OrderedDict (Python)?如何使嵌套在嵌套字典中的字典成为 OrderedDict (Python)?
【发布时间】:2021-09-27 05:43:48
【问题描述】:

我有以下字典,我需要对字典中的嵌套字典进行排序。

meta = {'task': {'id': 'text',
        'name': 'text',
        'size': '',
        'mode': 'interpolation',
        'overlap': '5',
        'bugtracker': '', 
        'created': '',
        'updated': '',
        'start_frame': '',
        'stop_frame': '',
        'frame_filter': '',
        'labels': {'label': {'name': 'text',
            'color': 'text',
            'attributes': {'attributes': {'name': 'text',
                         'mutable': 'False',
                         'input_type': 'text',
                         'default_value': '',
                         'values': '',}}}}}}
meta = collections.OrderedDict(meta)

我尝试使用来自here 的答案,使用如下所示的列表:

meta = {'task': [('id', 'text'),
        ('name', 'text'),
        ('size',''),
        ('mode', 'interpolation'),
        ('overlap', '5'),
        ('bugtracker', ''), 
        ('created', ''),
        ('updated', ''),
        ('start_frame', ''),
        ('stop_frame', ''),
        ('frame_filter', '')]}

但这不适用于嵌套在嵌套字典中的字典。如何将整个字典转换为 OrderedDict,甚至是最里面的嵌套字典?

附:我感觉here 的答案是我需要的,但我似乎无法弄清楚terminallhs 的变量是什么。如果有人可以提供帮助,那也将非常有帮助。

【问题讨论】:

  • 试试:meta = json.loads(json.dumps(meta), object_pairs_hook=OrderedDict)
  • 您确定需要OrderedDict 吗? OrderedDict 在相等性测试中考虑键顺序; dict 没有。否则,从 Python 3.7 开始,两者之间没有区别。
  • @chepner 我需要一个 OrderedDict,因为我将它转换为 XML,并且顺序应该与字典中的键相同
  • 从 Python 3.7 开始,您可以使用常规的 dict 来做到这一点;记住键的插入顺序以进行迭代。
  • 例如,{a: 1, b: 2}.keys() == [a, b] 现在得到保证,无论 ab 有什么值。它不再依赖用于将ab 插入dict 的哈希值。

标签: python dictionary


【解决方案1】:

这需要递归:

def convert(obj):
    if isinstance(obj, dict):
        return OrderedDict((k, convert(v)) for k, v in obj.items())
    # possibly, if your data contains lists
    if isinstance(obj, list):
        return [*map(convert, obj)]
    return obj

meta = convert(meta)

【讨论】:

    猜你喜欢
    • 2013-09-19
    • 2018-05-31
    • 2023-03-11
    • 2021-12-29
    • 1970-01-01
    • 2021-05-17
    • 2018-01-29
    • 2011-12-25
    • 1970-01-01
    相关资源
    最近更新 更多