python中嵌套的无限字典

时间:2012-03-20 09:12:06

标签: python dictionary

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

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相同。也许有更好的解决方案?

感谢。

3 个答案:

答案 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