带有 lambda 函数和标量的字典理解

Posted

技术标签:

【中文标题】带有 lambda 函数和标量的字典理解【英文标题】:Dict comprehension with lambda function and scalar 【发布时间】:2019-06-15 23:09:05 【问题描述】:

我对 lambda 函数和标量有 dict 理解:

d = k: lambda x : x.sum() if 'a' in k else 'yes' for k in ['bac','sss','asa']
print (d)
'bac': <function <dictcomp>.<lambda> at 0x00000000031891E0>, 
 'sss': <function <dictcomp>.<lambda> at 0x000000000D887EA0>, 
 'asa': <function <dictcomp>.<lambda> at 0x000000000D887B70>

如果想要两个标量都很好用:

d = k: 'no' if 'a' in k else 'yes' for k in ['bac','sss','asa']
print (d)
'bac': 'no', 'sss': 'yes', 'asa': 'no'

预期输出 - 标量和 lambda 函数的组合:

print (d)
'bac': <function <dictcomp>.<lambda> at 0x00000000031891E0>, 
 'sss': 'yes', 
 'asa': <function <dictcomp>.<lambda> at 0x000000000D887B70>

发生了什么?为什么它不工作?正确的做法是什么?

【问题讨论】:

d = k: (lambda x : x.sum()) if 'a' in k else 'yes' for k in ['bac','sss','asa'] 有效(将 lambda 括在括号中)但我不知道为什么。据推测,在您当前的方法中,表达式的其余部分将包含在 lambda 中。 【参考方案1】:

你的语法被解析如下(注意括号的位置):

k: lambda x : (x.sum() if 'a' in k else 'yes') for k in ['bac','sss','asa']
#              ^                              ^

你想要:

k: (lambda x : x.sum()) if 'a' in k else 'yes' for k in ['bac','sss','asa']
#   ^                  ^

这是因为lambda 比lower precedence 具有if-else

一个更简单的例子也说明了这一点:

>>> lambda x: 0 if False else True
<function <lambda> at 0x7efdbe55abf8>
>>> lambda x: (0 if False else True)
<function <lambda> at 0x7efdbe55ac80>
>>> (lambda x: 0) if False else True
True

【讨论】:

【参考方案2】:
d = k: (lambda x : x.sum()) if 'a' in k else 'yes' for k in ['bac','sss','asa']

应该可以。原因(据我所知)是解析 lambda 的边界与你的理解重叠——基本上,python 将你的 lambda 解析为x.sum() if 'a' in k else 'yes'——参考本地人

【讨论】:

以上是关于带有 lambda 函数和标量的字典理解的主要内容,如果未能解决你的问题,请参考以下文章

试图理解标量函数的作用

使用带有 lambda 参数的 reduce 函数获取具有相同键的新字典

不理解这个带有 defaultdict 的 lambda 表达式

Java Lambda 表达式的官网教程理解

自己理解Java中的lambda

深入理解Lambda函数及其用法