用lambda函数和标量进行字典理解

问题描述 投票:4回答:2

我有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>}

怎么了?为什么不工作?什么是正确的方法?

python python-3.x dictionary lambda dictionary-comprehension
2个回答
5
投票

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

{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']}
#   ^                  ^

这是因为lambdalower 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

4
投票
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' - 参考当地人

© www.soinside.com 2019 - 2024. All rights reserved.