【发布时间】:2019-06-23 03:10:30
【问题描述】:
我是 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")`
这超出了我的理解。据我所知,reduce(lambda...) 首先将值作为参数,但在这里它似乎将整个 dict 对象作为第一个参数。我真的迷路了,可以请有人逐步解释这个脚本的逻辑吗?
更新:
所以我编写了一些简单的 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做了什么并使用for循环重写它。应用函数并保存结果。您可以找到reduce的python 版本并将您的值替换为。 -
您应该在您链接的问题中接受已接受的答案。
reduce不是那么优雅和可读。
标签: python-3.x helper