使用 lambda 函数和标量的字典理解
Dict comprehension with lambda function and scalar
我对 lambda 函数和标量有字典理解:
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 的边界与你的理解重叠——基本上,python 将你的 lambda 解析为 x.sum() if 'a' in k else 'yes'
——参考 locals
你的语法解析如下(注意括号的位置):
{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
比if
-else
有lower precedence。
一个更简单的例子也说明了这一点:
>>> 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
我对 lambda 函数和标量有字典理解:
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 的边界与你的理解重叠——基本上,python 将你的 lambda 解析为 x.sum() if 'a' in k else 'yes'
——参考 locals
你的语法解析如下(注意括号的位置):
{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
比if
-else
有lower precedence。
一个更简单的例子也说明了这一点:
>>> 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