我想在字典中设置键和值。这是我做的一个例子。
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相同。也许有更好的解决方案?
感谢。
答案 0 :(得分:11)
由于d
中不存在c['a']
,您尝试向其添加1
时会发生什么样的行为?它会首先调用__getitem__
,而不是找到该密钥,然后返回NestedDict
,该int
不支持添加from collections import defaultdict
def create_nested_dict():
return defaultdict(create_nested_dict)
c = create_nested_dict()
。
在旁注中,它看起来好像你正在尝试使用“默认”值来实现字典。我会使用collections模块中提供的defaultdict类,如此
{{1}}
答案 1 :(得分:1)
首先,setdefault()
已经返回self[key]
(如果存在),您不需要__getitem__()
的第一行。
至于你的问题,你不能这样做。至少不使用现有代码。您已经为每个不存在的节点创建了NestedDict。现在你想要其中一些是数字?
也许您应该创建一个动态节点类,它可以作为dict
或数字运行,具体取决于需要?
答案 2 :(得分:1)
由于您可以控制放置在嵌套字典中的对象,因此只需对它们进行加法和减法,即添加到对象时,它只返回另一个对象(当添加到数字时,效果表现为数字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
瞧瞧:
>>> n = NestedDict()
>>> n["a"]["b"] += 1
>>> n["a"]["b"]
1