【问题标题】:Reduce() with lambda function and nested dictionary使用 lambda 函数和嵌套字典的 Reduce()
【发布时间】: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


【解决方案1】:

嗯。首先你应该看看reduce() 是如何工作的 如果我们有一个函数 fn 和一个列表 l=[a,b,c,d] 减少(fn, l) = fn(fn(fn(a,b),c),d) fn = lambda ....

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

【讨论】:

  • 该死!太感谢了!!!我是否正确理解 lambda 检查元素,如果它是带有“if isinstance”的嵌套字典,并且如果它是应用 .get() 和它的键?
猜你喜欢
  • 1970-01-01
  • 2020-06-29
  • 2011-07-02
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
  • 2016-02-05
  • 2022-12-03
  • 2021-05-17
相关资源
最近更新 更多