首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >defaultdict的嵌套默认

defaultdict的嵌套默认
EN

Stack Overflow用户
提问于 2013-10-04 19:28:50
回答 10查看 77.4K关注 0票数 199

是否有办法使defaultdict也成为defaultdict的缺省值?(即无限级递归默认值?)

我想做的是:

代码语言:javascript
复制
x = defaultdict(...stuff...)
x[0][1][0]
{}

所以,我可以做x = defaultdict(defaultdict),但这只是第二个层次:

代码语言:javascript
复制
x[0]
{}
x[0][0]
KeyError: 0

有一些食谱可以做到这一点。但是,仅仅使用正常的defaultdict参数就可以做到这一点吗?

注意,这是在询问如何执行无限级递归defaultdict,因此它不同于https://stackoverflow.com/questions/5029934,后者是如何执行两级默认的。

我可能最终会使用这个模式,但是当我意识到我不知道该怎么做的时候,它让我很感兴趣。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2013-10-04 19:33:55

对于任意数量的级别:

代码语言:javascript
复制
def rec_dd():
    return defaultdict(rec_dd)

>>> x = rec_dd()
>>> x['a']['b']['c']['d']
defaultdict(<function rec_dd at 0x7f0dcef81500>, {})
>>> print json.dumps(x)
{"a": {"b": {"c": {"d": {}}}}}

当然,您也可以使用lambda来完成这个任务,但我发现lambda的可读性较低。无论如何,它看起来都是这样的:

代码语言:javascript
复制
rec_dd = lambda: defaultdict(rec_dd)
票数 240
EN

Stack Overflow用户

发布于 2015-01-07 01:11:08

这里的其他答案告诉您如何创建包含“无限多”defaultdictdefaultdict,但是它们没有解决我认为可能是您最初需要的东西,即简单地有一个两深度的默认设置。

你可能一直在寻找:

代码语言:javascript
复制
defaultdict(lambda: defaultdict(dict))

您可能更喜欢这种结构的原因是:

  • 它比递归解决方案更明确,因此读者可能更容易理解。
  • 这使得defaultdict的“叶子”不是字典,例如:defaultdict(lambda: defaultdict(list))defaultdict(lambda: defaultdict(set))
票数 278
EN

Stack Overflow用户

发布于 2013-10-04 19:34:18

这样做有一个巧妙的诀窍:

代码语言:javascript
复制
tree = lambda: defaultdict(tree)

然后,您可以使用x创建x = tree()

票数 76
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19189274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档