我想有一本深度嵌套的字典。让我们“深刻地”考虑一下。为了显示我需要一个 5 级字典,例如,foo[1][2][3][4][5]将有一个set或list作为项目。
正如我在这里看到的,我至少可以通过两种方式实现这一点:
from collections import defaultdict
foo = defaultdict(lambda: defaultdict(lambda:defaultdict(lambda: defaultdict(lambda: defaultdict(set)))))
或者
from functools import partial
foo = defaultdict(partial(defaultdict, partial(defaultdict, partial(defaultdict, partial(defaultdict, set)))))
然后在这两种情况下我都可以,例如,foo[1][2][3][4][5].add(1)
但我一直在寻找一种不那么繁琐的方法来实现这一点,并找到了两种方法。第一个也提供了与上述解决方案相同的位置:
class NestedDict(dict):
  def __getitem__(self, key):
    if key in self: return self.get(key)
    return self.setdefault(key, NestedDict())
以及在 SO 上找到的第二个等价物作为Autovivification 问题的答案。
class NestedDict(dict):
  """Implementation of perl's autovivification feature."""
  def __getitem__(self, item):
    try:
      print "__getitem__: %s" % item
      return dict.__getitem__(self, item)
    except KeyError:
      value = self[item] = type(self)()
      print "value: %s" % value
      return value
我喜欢最后两种方法,但我不知道如何更改它们以生成特定类型的嵌套字典,例如,不是 dictset或list使用defaultdict.
提前感谢您的任何建议、评论或更正。