递归集合。defaultdict初始化

时间:2019-01-08 16:03:40

标签: python data-structures

我的目标是给定我称为datainit的python字典,创建递归collections.defaultdict的递归data,例如将data初始化为{{ 1}}和datainit可以扩展为缺少键的任何路径, 如下图所示

data

例如,从空字典开始的通常方法是:

from collections import *
datainit={'number':1}
data =something_with(defaultdict(), datainit)
data['A']['B']['C']=3
#At this stage, I want:
#data['A']['B']['C'] ==3
#data['number'] == 1
#and nothing else.

尝试:

nested_dict = lambda: defaultdict(nested_dict)
data = nested_dict()

从逻辑上说,将为每个丢失的键复制我的datainit:

nested_dict = lambda: defaultdict(nested_dict, datainit)
data = nested_dict()

所有这些都是有道理的,但是我该怎么做才从初始字典开始,然后对每个丢失的键仅使用一个空字典? 我的>>> datainit={'number':1} >>> nested_dict = lambda: defaultdict(nested_dict, datainit) >>> data=nested_dict() >>> data defaultdict(<function <lambda> at 0x7f58e5323758>, {'number': 1}) >>> data['A']['B']['C']=2 >>> data defaultdict(<function <lambda> at 0x7f58e5323758>, {'A': defaultdict(<function <lambda> at 0x7f58e5323758>, {'B': defaultdict(<function <lambda> at 0x7f58e5323758>, {'C': 2, 'number': 1}), 'number': 1}), 'number': 1}) 应该是什么。

可能很明显,但我看不到!

1 个答案:

答案 0 :(得分:1)

您有两层;最顶层的defaultdict(必须具有number键)和一系列任意嵌套的字典(必须没有)。您的错误是尝试将它们视为一个,将尝试'number'视为缺少值的工厂应处理的事情。

只需在顶部词典中设置number键即可。这样的键只有一个,带有值,defaultdict()工厂应该对其进行处理。工厂在那里提供任意缺失键的默认值,number不是任意键。

from collections import defaultdict

def topleveldict():
    nested_dict = lambda *a, **kw: defaultdict(nested_dict, *a, **kw)
    return nested_dict(number=1)  # or nested_dict({'number': 1})

data = topleveldict()

仅当您计划在代码库中的多个位置创建结构时,才需要topleveldict()函数。如果只有一个这样的对象或只有一个地方可以创建这些对象,则只需内联该函数中的代码即可:

nested_dict = lambda *a, **kw: defaultdict(nested_dict, *a, **kw)
data = nested_dict(number=1)  # or nested_dict({'number': 1})