因此,我如何为此创建一个defaultdict:
{
'branch': {
'count': 23,
'leaf': {
'tag1': 30,
'tag2': 10
}
},
}
这样,默认情况下,
count
,tag1
和tag2
会为零?我想在阅读输入内容时动态填充字典。当我看到一个新的branch
时,我想创建一个count
为零而空的dict为叶的字典。当我得到leaf
时,我想用它的名称创建一个 key 并将其值设置为零。更新:
接受Martijn的回答,因为它有更多的赞成票,但其他答案也同样好。
最佳答案
您无法使用defaultdict
进行此操作,因为工厂无法访问该 key 。
但是,您可以仅将dict
子类化以创建自己的类似于defaultdict
的“智能”类。提供您自己的 __missing__
method,它根据键添加值:
class KeyBasedDefaultDict(dict):
def __init__(self, default_factories, *args, **kw):
self._default_factories = default_factories
super(KeyBasedDefaultDict, self).__init__(*args, **kw)
def __missing__(self, key):
factory = self._default_factories.get(key)
if factory is None:
raise KeyError(key)
new_value = factory()
self[key] = new_value
return new_value
现在,您可以提供自己的映射:
mapping = {'count': int, 'leaf': dict}
mapping['branch'] = lambda: KeyBasedDefaultDict(mapping)
tree = KeyBasedDefaultDict(mapping)
演示:
>>> mapping = {'count': int, 'leaf': dict}
>>> mapping['branch'] = lambda: KeyBasedDefaultDict(mapping)
>>> tree = KeyBasedDefaultDict(mapping)
>>> tree['branch']['count'] += 23
>>> tree['branch']['leaf']['tag1'] = 30
>>> tree['branch']['leaf']['tag2'] = 10
>>> tree
{'branch': {'count': 23, 'leaf': {'tag1': 30, 'tag2': 10}}}
关于Python嵌套具有混合数据类型的defaultdict,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31837472/