python中的嵌套无限字典

2024-09-28 15:23:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在字典里设置键和值。这是我做什么的一个例子。在

class NestedDict(dict):
    def __getitem__(self, key):
        if key in self: return self.get(key)
        return self.setdefault(key, NestedDict())

>>> c = NestedDict()
>>> c
{}
>>> c['a']['b'] = 'test'
>>> c['a']['c'] = 2
>>> c
{'a': {'c': 2, 'b': 'test'}}
>>> c['a']['c'] += 1
>>> c
{'a': {'c': 3, 'b': 'test'}}
>>> c['a']['d'] += 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +=: 'NestedDict' and 'int'

有什么办法解决这个问题吗?我希望能够使用+=和-=。当然,如果值不存在,那么+=1等于=1。也许有更好的解决办法?在

谢谢。在


Tags: keyintestselfgetreturnif字典
3条回答

既然dc['a']中不存在,那么当您试图向其添加1时,您希望它有什么样的行为?它将首先调用__getitem__,而不是找到密钥,然后返回一个NestedDict,它不支持加上int。在

顺便说一句,在我看来,你好像在用一个“默认”值实现一个字典。我将使用collections模块中可用的defaultdict类,如下所示

from collections import defaultdict

def create_nested_dict():
   return defaultdict(create_nested_dict)

c = create_nested_dict()

由于您可以控制放置在嵌套dict中的对象,所以只需定义对它们的加减法,即当添加到对象时,它只返回另一个对象(当添加到数字时,它会有效地表现为数字0):

class NestedDict(dict):
    def __getitem__(self, key):
        if key in self: return self.get(key)
        return self.setdefault(key, NestedDict())
    def __add__(self, other):
        return other
    def __sub__(self, other):
        return other

沃伊拉:

^{pr2}$

首先,setdefault()已经返回self[key]如果存在,则不需要__getitem__()的第一行。在

至于你的问题,你做不到。至少在你现有的代码中没有。您已经为每个不存在的节点创建了一个NestedDict。现在你想让其中一些成为数字?在

也许您应该创建一个动态节点类,它可以作为dict或作为一个数字,这取决于需要吗?在

相关问题 更多 >