Python 3.x 带有lambda函数和嵌套字典的Reduce()

Python 3.x 带有lambda函数和嵌套字典的Reduce(),python-3.x,helper,Python 3.x,Helper,我是python的初学者,面临获取嵌套字典值的问题。所以我查找stackoverflow,在这里:我找到了这个解决方案: dic={"a":{"b":2}, "c":{"d":{"e":3}}} def deep_find(dic,keys, default=None): return print(reduce(lambda di, key: di.get(key, default) if isinstance(di, dict) else default, keys.split(".

我是python的初学者,面临获取嵌套字典值的问题。所以我查找stackoverflow,在这里:我找到了这个解决方案:

dic={"a":{"b":2}, "c":{"d":{"e":3}}}

def deep_find(dic,keys, default=None):
    return print(reduce(lambda di, key: di.get(key, default) if isinstance(di, dict) else default, keys.split("."), dic))

deep_find(dic,"c.d.e")`
这超出了我的理解。正如我所知,reduce(lambda…)将值作为第一个参数,但这里它似乎将整个dict对象作为第一个参数。我真的迷路了,能不能请人一步一步地解释一下这个脚本的逻辑

Upd:

所以我编了一些简单的dict,在reduce+lamda表达式中使用它。使用print()我发现lambda的第一个变量取决于我们在iterable dictionary之前提供的键列表

from functools import reduce
d={1:2, 3:4,5:6}
k="1.3.5"
def get(d,ks):
    reduce(lambda a,b: print(a,",",b,".") and a*b, ks, d)

get(d,k)

在本例中,第一个“a”值将是完整的dict“d”,第一个“b”值将是“k”中的第一个键值,即“1”,这与是否有一组键或仅提供一个键无关:第一个“a”值将是整个字典。若在字典之前我们并没有提供键,那个么这个函数将只对键值进行迭代。这都是因为如果我们把keys list放在dictionary之前,那么keys将是iterable,dict将是initializer,所以他将成为第一个参数。首先,您应该了解
reduce()
的工作原理 如果我们有一个函数fn和一个列表
l=[a,b,c,d]
减少(fn,l)=fn(fn(fn(a,b),c),d) fn=λ

示例的Lambda表达式将字符串转换为易于操作的列表(
“c.d.e”.split('.')=[c,d,e]

lambda表示,如果键在我们想要的行中,则取嵌套循环的值,否则,如果它是子节点,则取字典的键。

尝试查看
reduce
的作用,并使用
for
循环重写它。应用函数并保存结果。您可以找到python版本的
reduce
,并在中替换您的值。您应该在链接的问题中采用公认的答案<代码>减少没有那么优雅易读。该死!非常感谢你!!!我是否正确理解lambda检查元素,以及它是否是一个带有“if-isinstance”的嵌套字典,以及它是否适用。get()和它的键?