假设我们有一个生成器表达式,也许是一个简单的表达式,但不一定如此:
(function(x) for x in values)
过滤此生成器表达式生成的值的首选方法是什么? IE。我们不想过滤 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
可在左侧使用。
关于python - 过滤生成器表达式输出的pythonic/惯用方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67595447/