python - Python中不带[]的列表理解

标签 python list-comprehension

加入列表:

>>> ''.join([ str(_) for _ in xrange(10) ])
'0123456789'

join 必须采用可迭代对象。

显然,join的参数是[ str(_) for _ in xrange(10) ],它是一个list comprehension

看看这个:

>>>''.join( str(_) for _ in xrange(10) )
'0123456789'

现在,join 的参数只是 str(_) for _ in xrange(10),没有 [],但是结果是一样的。

为什么? str(_) for _ in xrange(10) 是否也产生列表或可迭代对象?

最佳答案

其他受访者正确回答您发现了 generator expression (它的符号类似于列表推导式,但没有方括号)。

一般来说,基因表达式(因为它们被亲切地称为)比列表推导更节省内存和更快。

然而,在 ''.join() 的情况下,列表推导式更快,内存效率更高。原因是 join 需要对数据进行两次传递,所以它实际上需要一个真实的列表。如果你给它一个,它可以立即开始工作。如果你给它一个 genexp,它就不能开始工作,直到它通过运行 genexp 在内存中建立一个新的列表到耗尽:

~ $ python -m timeit '"".join(str(n) for n in xrange(1000))'
1000 loops, best of 3: 335 usec per loop
~ $ python -m timeit '"".join([str(n) for n in xrange(1000)])'
1000 loops, best of 3: 288 usec per loop

比较 itertools.imapmap 的结果相同:

~ $ python -m timeit -s'from itertools import imap' '"".join(imap(str, xrange(1000)))'
1000 loops, best of 3: 220 usec per loop
~ $ python -m timeit '"".join(map(str, xrange(1000)))'
1000 loops, best of 3: 212 usec per loop

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

相关文章:

python - 对新元素进行条件列表理解

python - Keras属性错误: 'Tensor' object has no attribute 'log'

python - 将所有数字相加的递归函数

Python odbc游标: keeping persistent state after executing a query

python - 在给定条件的情况下访问 Python 中另一个列表的列表

python - 按类型有效地汇总项目

python - 获取<生成器对象<genexpr>

python - 如何实现线性插值?

python - 如何编写subprocess.Popen终端执行

python - 破解这个嵌套列表列表?