【问题标题】:Nested, infinite dictionary in pythonpython中的嵌套无限字典
【发布时间】:2012-03-20 09:12:05
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 这是因为你的 c['a']['d'] 没有值,所以你启动它并想要增加一些东西。 juste do c['a']['d'] = 0 然后你可以做你想要的
  • 当你写c[someNonExistingKey] +=1时,你想要什么结果?
  • 我知道,但我想写一些如果没有值会自动设置为 0 并被使用 =+
  • 如果我说c[non_existing_key],它应该返回NestedDict还是0

标签: python dictionary


【解决方案1】:

由于dc['a'] 中不存在,当您尝试将1 添加到其中时,您期望什么样的行为?它将首先调用__getitem__,找不到密钥,然后返回一个NestedDict,它不支持使用int 就地添加。

顺便说一句,在我看来,您好像在尝试使用“默认”值实现字典。我会像这样使用集合模块中可用的 defaultdict 类

from collections import defaultdict

def create_nested_dict():
   return defaultdict(create_nested_dict)

c = create_nested_dict()

【讨论】:

    【解决方案2】:

    由于您可以控制放置在嵌套字典中的对象,因此只需定义对它们的加法和减法,当添加到一个对象时,它只返回另一个对象(添加到数字时有效地表现为数字 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
    

    【讨论】:

    • 完美。正是我想要的。谢谢。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-05-31
      • 2016-01-08
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      相关资源
      最近更新 更多