首页 > 解决方案 > 过滤生成器表达式输出的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函数。

标签: pythonpython-3.x

解决方案


关于这是否更好是一个争论的问题,但:=可以在这里使用:

filtered = (res for val in values if (res := function(val)))

函数的结果分配给res,该结果用作谓词,然后res可用于左侧。


推荐阅读