我想在字典里设置键和值。这是我做什么的一个例子。在
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。也许有更好的解决办法?在
谢谢。在
既然
d
在c['a']
中不存在,那么当您试图向其添加1
时,您希望它有什么样的行为?它将首先调用__getitem__
,而不是找到密钥,然后返回一个NestedDict
,它不支持加上int
。在顺便说一句,在我看来,你好像在用一个“默认”值实现一个字典。我将使用collections模块中可用的defaultdict类,如下所示
由于您可以控制放置在嵌套dict中的对象,所以只需定义对它们的加减法,即当添加到对象时,它只返回另一个对象(当添加到数字时,它会有效地表现为数字0):
沃伊拉:
^{pr2}$首先,
setdefault()
已经返回self[key]
如果存在,则不需要__getitem__()
的第一行。在至于你的问题,你做不到。至少在你现有的代码中没有。您已经为每个不存在的节点创建了一个NestedDict。现在你想让其中一些成为数字?在
也许您应该创建一个动态节点类,它可以作为
dict
或作为一个数字,这取决于需要吗?在相关问题 更多 >
编程相关推荐