python - 没有 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
语句的好方法。我也试过这些似乎不起作用。有什么建议么?
解决方案
Lambdas 总是会返回一些东西。并且通过您拥有它的方式(忽略无效语法),某些内容将始终进入您的列表理解产生的列表中。因此,出于您的目的,您可以将if
lambda 内部的 移动到列表理解本身。事实上,你根本不需要 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
.
推荐阅读
- css - 'disable' 不会阻止 'onpointerup' 事件。是否有使用指针事件的“onclick”等效项?
- python - 如何修复:“UnboundLocalError:分配前引用的局部变量 'all_sprites'”
- amazon-web-services - 使用 AWS Rekognition 从视频中提取文本
- javascript - Javascript 在加载页面进行搜索输入时触发 Enter 键而无需实际按下 Enter 键
- java - mybatis中的动态sql列表
- docker - 错误:构建映像并尝试在 Docker 上运行时,OCI 运行时创建失败
- gitlab-ci-runner - 在 gitlab 共享运行器上运行时,回车 (\r) 运算符不起作用
- javascript - 在javascript中首先显示加载的元素
- amazon-web-services - 无法从本地机器连接到 rds
- c - 为什么这段代码在输入和输出行之间打印一个随机字符?