首页 > 解决方案 > 没有 else 语句的 lambda 函数中的单行 if 语句

问题描述

这个问题可能有点奇怪,因为我专注于 lambda 函数,我想过滤数组并返回一个新数组,其中包含可被 2 整除的值。为此,我的代码是......

alist = [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

devided = [(lambda x: x if x%2 == 0 : return x)(x) for x in alist]

print(devided)

我得到这个结果...

[None, 4, None, 16, None, 36, None, 64, None, 100]

我需要摆脱这些None价值观。这可能是我可以跳过执行else语句的好方法。我也试过这些似乎不起作用。有什么建议么?

标签: pythonpython-3.x

解决方案


Lambdas 总是会返回一些东西。并且通过您拥有它的方式(忽略无效语法),某些内容将始终进入您的列表理解产生的列表中。因此,出于您的目的,您可以将iflambda 内部的 移动到列表理解本身。事实上,你根本不需要 lambda。

devided = [x for x in alist if x%2==0]

但如果你真的想要一个 lambda,它看起来像这样:

devided = [x for x in alist if (lambda x:x%2==0)(x)]

当您将 a 放在if列表理解的末尾时,您是在告诉解释器,如果该语句的计算结果为False,(在您的情况下意味着这x是一个奇数),那么在结果列表。基本上是说“忽略这个值,我不希望它映射到任何东西,我不想在查看结果列表时看到它曾经存在过的任何证据”。

这与if在列表理解的开头将语句放在 lambda 中不同。当您这样做时,您是在告诉解释器您希望该 lambda 返回的值出现在结果列表中,即使该值是None.


推荐阅读