Reduce() 与 lambda 函数和嵌套字典

Reduce() with lambda function and nested dictionary

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

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 对象作为第一个参数。我真的迷路了,请问有人一步一步解释这个脚本的逻辑吗?

更新:

所以我编写了一些简单的字典来在 reduce+lamda 表达式中使用它。使用 print() 我发现 lambda 的第一个变量取决于我们在可迭代字典之前提供的键列表。

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" 值将是整个字典 "d",第一个 "b" 值将是 "k" 中的第一个键值,即“1”和提供一组键还是只提供一个键并不重要:第一个 "a" 值将是整个字典。如果我们在字典之前不提供键,函数将只迭代键值。这就是因为如果我们将键列表放在字典之前,那么键将是可迭代的,而字典将是初始化器,因此他将成为第一个参数。

嗯。首先你应该看看 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 表示如果键在我们想要的行中,则取嵌套循环的值,否则如果它是子节点,则取字典的键。