为了账号安全,请及时绑定邮箱和手机立即绑定

Deftdict的嵌套defaultdict

Deftdict的嵌套defaultdict

白板的微信 2019-08-02 07:02:02
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?,这就是如何做两级违约。我可能会用束束但是当我意识到我不知道该怎么做的时候,这让我很感兴趣。
查看完整描述

3 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

对于任意数量的级别:

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的可读性较低。在任何情况下,它看起来都是这样的:

rec_dd = lambda: defaultdict(rec_dd)



查看完整回答
反对 回复 2019-08-03
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

这里的其他答案告诉您如何创建一个defaultdict其中包含“无限多”defaultdict,但他们没有解决我认为可能是你最初的需求,那就是简单地有一个两深度的违约。

你可能一直在寻找:

defaultdict(lambda: defaultdict(dict))

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

  • 它比递归解决方案更明确,因此读者可能更容易理解。
  • 这将启用

    defaultdict

    不是词典,例如:

    defaultdict(lambda: defaultdict(list))

    defaultdict(lambda: defaultdict(set))




查看完整回答
反对 回复 2019-08-03
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

类似于BrenBarn的解决方案,但不包含变量的名称tree两次,所以即使在对变量字典进行更改之后,它也能工作:

tree = (lambda f: f(f))(lambda a: (lambda: defaultdict(a(a))))

然后您可以创建每个新的x带着x = tree().


def版本时,我们可以使用函数闭包作用域来保护数据结构不受现有实例停止工作的缺陷(如果tree名字叫反弹。看起来是这样的:

from collections import defaultdictdef tree():
    def the_tree():
        return defaultdict(the_tree)
    return the_tree()




查看完整回答
反对 回复 2019-08-03
  • 3 回答
  • 0 关注
  • 342 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号