因此,我如何为此创建一个defaultdict:

{
    'branch': {
        'count': 23,
        'leaf': {
            'tag1': 30,
            'tag2': 10
        }
    },
}

这样,默认情况下,counttag1tag2会为零?我想在阅读输入内容时动态填充字典。当我看到一个新的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/

10-12 21:43