首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python中的回指表理解

Python中的回指表理解
EN

Stack Overflow用户
提问于 2013-11-20 00:35:21
回答 4查看 1.9K关注 0票数 12

考虑以下玩具示例:

代码语言:javascript
运行
复制
>>> def square(x): return x*x
... 
>>> [square(x) for x in range(12) if square(x) > 50]
[64, 81, 100, 121]

我必须在列表理解中打两次方格(X)。这种复制很难看,很容易出错(在修改代码时很容易更改这两个调用中的一个),而且效率很低。

我当然可以这么做:

代码语言:javascript
运行
复制
>>> squares = [square(x) for x in range(12)]
>>> [s for s in squares if s > 50]
[64, 81, 100, 121]

或者这个:

代码语言:javascript
运行
复制
[s for s in [square(x) for x in range(12)] if s > 50]

这两者都是可居住的,但似乎有一种方法可以在一条语句中完成这一切,而不必嵌套两个列表理解,我知道,下次我读代码时,我得盯着它看一段时间,才能弄清楚到底发生了什么。有办法吗?

我想问我一个公平的问题,就是我想象这样的语法会是什么样子。这里有两个想法,但在Python中既不习惯(也不起作用)。他们受到Lisp中的回指宏的启发。

代码语言:javascript
运行
复制
[square(x) for x in range(12) if it > 50]
[it=square(x) for x in range(12) if it > 50]
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-11-20 00:38:33

您应该使用生成器:

代码语言:javascript
运行
复制
[s for s in (square(x) for x in range(12)) if s > 50]

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

票数 21
EN

Stack Overflow用户

发布于 2013-11-20 01:31:23

下面是嵌套生成器与“链式”列表比较和计算两次

代码语言:javascript
运行
复制
$ python -m timeit "[s for n in range(12) for s in [n * n] if s > 50]"
100000 loops, best of 3: 2.48 usec per loop
$ python -m timeit "[s for s in (x * x for x in range(12)) if s > 50]"
1000000 loops, best of 3: 1.89 usec per loop
$ python -m timeit "[n * n for n in range(12) if n * n > 50]"
1000000 loops, best of 3: 1.1 usec per loop

$ pypy -m timeit "[s for n in range(12) for s in [n * n] if s > 50]"
1000000 loops, best of 3: 0.211 usec per loop
$ pypy -m timeit "[s for s in (x * x for x in range(12)) if s > 50]"
1000000 loops, best of 3: 0.359 usec per loop
$ pypy -m timeit "[n * n for n in range(12) if n * n > 50]"
10000000 loops, best of 3: 0.0834 usec per loop

我使用n * n而不是square(n),因为它很方便,并且从benckmark删除了函数调用的开销。

TLDR:对于简单的情况,最好只是重复计算。

票数 10
EN

Stack Overflow用户

发布于 2013-11-20 00:43:11

另一种选择是使用“链式”列表复式,而不是嵌套式:

代码语言:javascript
运行
复制
[s for n in range(12) for s in [square(n)] if s > 50]

不过,可能是个奇怪的读物。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20085164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档