python - Python 中的照应列表理解

标签 python list-comprehension

考虑以下玩具示例:

>>> def square(x): return x*x
... 
>>> [square(x) for x in range(12) if square(x) > 50]
[64, 81, 100, 121]

我必须在列表理解中调用 square(x) 两次。重复很丑陋,容易出错(修改代码时很容易只更改两个调用中的一个),而且效率低下。

我当然可以这样做:

>>> squares = [square(x) for x in range(12)]
>>> [s for s in squares if s > 50]
[64, 81, 100, 121]

或者这个:

[s for s in [square(x) for x in range(12)] if s > 50]

这些都是宜居的,但感觉好像有一种方法可以在一个语句中完成所有操作而无需嵌套两个列表理解,我知道下次我将不得不盯着它看一会儿'我阅读代码只是为了弄清楚发生了什么。有办法吗?

我想问我一个合理的问题是我想象中的这种语法会是什么样子。这里有两个想法,但在 Python 中都不是惯用的(也不起作用)。他们的灵感来自 anaphoric macros in Lisp .

[square(x) for x in range(12) if it > 50]
[it=square(x) for x in range(12) if it > 50]

最佳答案

你应该使用生成器:

[s for s in (square(x) for x in range(12)) if s > 50]

这避免了创建中间未过滤的方 block 列表。

关于python - Python 中的照应列表理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20085164/

相关文章:

python - 使用 python 使用准确的标签将时间范围扩展为更小增量的更多步骤

python - 在没有脚本文件的情况下从命令行执行python程序

for-loop - 了解 Clojure 中的列表理解修饰符顺序

python - 如何动态使用Python的类型提示来指示返回值与参数类型相同

python - 如何使用 numpy 将简单线性回归与梯度下降并行化?

python - 拆分字符串的最佳方法

python - 如何对非唯一项列表使用字典推导式

python - for-if 一行中没有列表理解

python - 显式继承 'type'以实现python3.x中的元类

python - 使用pygsheets使用service_file授权方法创建一个全新的sheet