有没有办法使 defaultdict 也成为 defaultdict 的默认值? (即无限级递归defaultdict?)
我希望能够做到:
x = defaultdict(...stuff...)
x[0][1][0]
{}
所以,我可以做
x = defaultdict(defaultdict)
,但这只是第二级:
x[0]
{}
x[0][0]
KeyError: 0
有一些食谱可以做到这一点。但是可以简单地使用普通的 defaultdict 参数来完成吗?
注意,这是询问如何执行无限级递归 defaultdict,因此它与 Python: defaultdict of defaultdict 不同? ,这就是如何实现的做一个两级的defaultdict。
我可能最终会使用 束 模式,但是当我意识到我不知道如何做到这一点时,它引起了我的兴趣。
可以通过将 lambda 表达式作为
defaultdict
构造函数的参数传递来创建一个无限递归的
defaultdict
,该表达式创建另一个
defaultdict
:
from collections import defaultdict
x = defaultdict(lambda: defaultdict(lambda: defaultdict(int)))
# 现在可以无限地访问嵌套字典:
x[0][1][0] = 5
x[1][2][3][4][5] = 10
print(x[0][1][0]) # 输出:5
print(x[1][2][3][4][5]) # 输出:10
在这个例子中:
-
我们创建了一个
defaultdict
,名为x
。 -
lambda: defaultdict(lambda: defaultdict(int))
部分是一个 lambda 表达式,它充当工厂函数来创建新的defaultdict
。 -
最内层的
defaultdict(int)
指定默认值为整数 (int
),但可以将其更改为任何想要的类型或甚至另一个 lambda 表达式以实现更深层次的嵌套。
这种方法允许创建具有任意级别的嵌套
defaultdict
,而无需预先定义结构。当尝试访问以前未访问过的键时,将按需创建新的
defaultdict
。