Deftdict的嵌套defaultdict

Deftdict的嵌套defaultdict

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

我想做的是:

x = defaultdict(...stuff...)x[0][1][0]{}

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

x[0]{}x[0][0]KeyError: 0

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

注意,这是在询问如何进行无限级别的递归默认设置,因此它不同于Python:defaultdict的defaultdict?,这就是如何做两级违约。

我可能会用束束但是当我意识到我不知道该怎么做的时候,这让我很感兴趣。


有只小跳蛙
浏览 853回答 3
3回答

12345678_0001

对于任意数量的级别:def&nbsp;rec_dd(): &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;defaultdict(rec_dd)>>>&nbsp;x&nbsp;=&nbsp;rec_dd()>>>&nbsp;x['a']['b']['c']['d']defaultdict(<function&nbsp;rec_dd&nbsp;at&nbsp;0x7f0dcef81500>,&nbsp;{})>>>&nbsp;print&nbsp;json.dumps(x){"a":&nbsp;{"b":&nbsp;{"c":&nbsp;{"d":&nbsp;{}}}}}当然,您也可以使用lambda来完成这个任务,但我发现lambda的可读性较低。在任何情况下,它看起来都是这样的:rec_dd&nbsp;=&nbsp;lambda:&nbsp;defaultdict(rec_dd)

慕仙森

这里的其他答案告诉您如何创建一个defaultdict其中包含“无限多”defaultdict,但他们没有解决我认为可能是你最初的需求,那就是简单地有一个两深度的违约。你可能一直在寻找:defaultdict(lambda:&nbsp;defaultdict(dict))您可能更喜欢这种结构的原因是:它比递归解决方案更明确,因此读者可能更容易理解。这将启用defaultdict不是词典,例如:defaultdict(lambda: defaultdict(list))或defaultdict(lambda: defaultdict(set))

江户川乱折腾

类似于BrenBarn的解决方案,但不包含变量的名称tree两次,所以即使在对变量字典进行更改之后,它也能工作:tree&nbsp;=&nbsp;(lambda&nbsp;f:&nbsp;f(f))(lambda&nbsp;a:&nbsp;(lambda:&nbsp;defaultdict(a(a))))然后您可以创建每个新的x带着x = tree().为def版本时,我们可以使用函数闭包作用域来保护数据结构不受现有实例停止工作的缺陷(如果tree名字叫反弹。看起来是这样的:from&nbsp;collections&nbsp;import&nbsp;defaultdictdef&nbsp;tree(): &nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;the_tree(): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;defaultdict(the_tree) &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;the_tree()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python