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

Deftdict的嵌套defaultdict

Deftdict的嵌套defaultdict

有只小跳蛙 2019-07-20 09:48:18
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 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

对于任意数量的级别:

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-07-20
?
慕仙森

TA贡献1827条经验 获得超7个赞

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

你可能一直在寻找:

defaultdict(lambda: defaultdict(dict))

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

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

    defaultdict

    不是词典,例如:

    defaultdict(lambda: defaultdict(list))

    defaultdict(lambda: defaultdict(set))


查看完整回答
反对 回复 2019-07-20
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

类似于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-07-20
  • 3 回答
  • 0 关注
  • 852 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信