提问者:小点点

带有lambda函数和嵌套字典的Reduce()


我是Python的初学者,面临着获取嵌套字典值的问题。所以我查找stackoverflow,在这里: 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")`

这超出了我的理解。据我所知,减少(λ…)首先将值作为参数,但这里似乎将整个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”值将是整个“d”,第一个“b”值将是“k”中的第一个键值,它是“1”,不管是有一组键还是只提供一个键:第一个“a”值将是整个词典。如果我们在字典之前不提供键,函数将只迭代键值。这都是因为如果我们把键列表放在二进制之前,那么键将是可迭代的,而二进制将是初始化器,所以他将成为第一个参数。


共1个答案

匿名用户

好首先,如果我们有一个函数fn和一个列表l=[a,b,c,d]reduce(fn,l)=fn(fn(fn(a,b),c),d)fn=lambda,那么您应该看到reduce()是如何工作的。。。。

示例的Lambda表达式将字符串转换为易于操作的列表(“c.d.e”.split('.')=[c,d,e])Lambda表示如果键在我们想要的行中,则取嵌套循环的值,否则如果它是子节点,则取字典的键。