python - 过滤生成器表达式输出的pythonic/惯用方法是什么?
问题描述
假设我们有一个生成器表达式,可能是一个简单的表达式,但不一定是这样:
(function(x) for x in values)
过滤此生成器表达式生成的值的首选方法是什么?即我们不想过滤 的值x
,而是过滤function(x)
?
当然
# this only filters on the inputs to the function, not on its results
(function(x) for x in values if _some_condition_expr_)
我认为以下是最 Pythonic 的(顺便说一句,也摆脱了生成器表达式本身):
_ = lambda x: x # simple filter for truthy values
filter(_, map(function, values)) # <<< is this the best we can do?
# or
filter(_, (generator_expression_contents_here))
- 与这种可憎的相反:
(y for y in (function(x) for x in values) if y)
生成器表达式中是否缺少某些内容,可以在不嵌套表达式等的情况下过滤结果?换句话说,这种filter(map())
方法是我们能做的最好的吗?我不是想找到一些深奥的东西,只是确保我没有错过一些更干净或更 Pythonic 的方式。
AFAIK,Python 没有标识函数(_
上面),也没有is_true
函数。
解决方案
关于这是否更好是一个争论的问题,但:=
可以在这里使用:
filtered = (res for val in values if (res := function(val)))
函数的结果分配给res
,该结果用作谓词,然后res
可用于左侧。
推荐阅读
- php - WooCommerce:仅为特定产品类别设置最低订单金额
- python - 如何在pyqt5中导入字体系列?
- ios - Firebase 上 iOS 的 Flutter 集成测试?
- html - 未捕获的 ReferenceError:未定义 sceditor
- git - 从工作树中拉出?
- python - 发送输入后立即删除输入行
- xslt-1.0 - 使用 XSLT1 将文档动态指定到变量中
- scala - 在 AWS Glue 上使用 Deequ
- typescript - 混合手动声明和推断类型
- java - 用于验证 Dto 的 Csutom 注释包含两个使用 java 验证和 Spring Boot 的列表