【问题标题】:convert each sub-dictionary in a nested dictionary to defaultdict in Python将嵌套字典中的每个子字典转换为 Python 中的 defaultdict
【发布时间】:2017-07-25 19:29:02
【问题描述】:
 class MyDict(dict):
        pass

 def nest_dict(dct):
     dct = MyDict(dct)
     for k, v in dct.items():
         if isinstance(v, dict):
             dct[k] = MyDict(v)
             nest_dict(v)
     return dct 

dct = {'a':{'b':{'c':'d'}}}
print(type(nest_dict(dct)['a']['b']))

这是我现在拥有的一段代码。我想要做的是将嵌套字典中的每个子字典转换为 dict 的子类,即 MyDict。 但是,我的递归逻辑只改变了子字典的第一级。如何修改这个递归函数?

【问题讨论】:

  • 一个明显的缺陷是您从不调用nest_dict() 函数。此外,pass 拼写错误。此外,dct['a']['b']['c'] 是字符串 d。它永远不会受到nest_dict() 的影响。请创建一个简短而完整的程序,该程序可以实际运行并实际演示您的问题。将该程序(永远不要重新输入)连同它的实际输出和期望输出一起复制并粘贴到您的问题中。请参阅minimal reproducible example 了解更多信息。

标签: python dictionary recursion


【解决方案1】:

您没有正确更新嵌套结构,请尝试:

def nest_dict(dct):
    dct = MyDict(dct)
    for k, v in dct.items():
        if isinstance(v, dict):
            dct[k] = nest_dict(v)
    return dct

dct = {'a': {'b': {'c': 'd'}}}
print(type(dct['a']['b']))  # <class 'dict'>
my_dct = nest_dict(dct)
print(type(my_dct['a']['b']))  # <class '__main__.MyDict'>

虽然我建议您不要扩展 dict 并改用 collections.MutableMapping。在 Python 3.x 上,它已移至 collections.abc.MutableMapping

【讨论】:

  • 这对我很有效。非常感谢。我会尝试学习 MutableMapping。您能否详细说明我的解决方案失败的原因?
【解决方案2】:

您可以使用深度优先搜索来遍历dict

class MyDict(dict):
    pass

dct = {'a':{'b':{'c':'d'}}}


def nest_dict(dct):
    dct = res = MyDict(dct)
    candidates = [(k, dct) for k in dct]
    while candidates:
        k, dct = candidates.pop()
        if isinstance(dct[k], dict):
            dct[k] = MyDict(dct[k])
            candidates.extend((k_, dct[k]) for k_ in dct[k])

    return res

dct2 = nest_dict(dct)

【讨论】:

    【解决方案3】:

    定义一个函数dict_to_defaultdict(),在函数内部循环它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      • 2023-03-11
      • 1970-01-01
      • 2022-11-04
      • 1970-01-01
      • 2017-01-20
      • 2023-01-23
      相关资源
      最近更新 更多