我想有一本深度嵌套的字典。让我们“深刻地”考虑一下。为了显示我需要一个 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
.
提前感谢您的任何建议、评论或更正。