gpt4 book ai didi

具有混合数据类型的 Python 嵌套 defaultdict

转载 作者:太空宇宙 更新时间:2023-11-03 12:58:24 38 4
gpt4 key购买 nike

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

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

这样,我会默认为 counttag1tag2 取零?我想在读取输入时动态填充字典。当我看到一个新的 branch 时,我想创建一个字典,其中 count 为零,一个空字典为叶子。当我得到一个叶子时,我想用它的名字创建一个键并将值设置为零。

更新:接受了 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/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com