考虑以下玩具示例:
>>> 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/