[英]Recursive collections.defaultdict initialization
我的目标是,给定一个我称之为datainit
的 python dict,创建一个递归的collections.defaultdict
,我称之为data
,例如data
用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()
试:
nested_dict = lambda: defaultdict(nested_dict, datainit)
data = nested_dict()
逻辑上会导致我的 datainit 为每个丢失的键复制:
>>> 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})
所有这些都是有道理的,但是我该怎么做才能从初始字典开始,然后为每个缺少的键使用一个空字典? 我的something_with(defaultdict(), datainit)
应该是something_with(defaultdict(), datainit)
。
可能很明显,但我看不到它!
你有两层; 顶级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})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.