我的目标是给定我称为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})
应该是什么。
可能很明显,但我看不到!
答案 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})