首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python中不带[]的列表理解

Python中不带[]的列表理解
EN

Stack Overflow用户
提问于 2012-01-30 15:29:48
回答 3查看 22.6K关注 0票数 94

加入列表:

代码语言:javascript
复制
>>> ''.join([ str(_) for _ in xrange(10) ])
'0123456789'

join必须接受一个可迭代的。

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

看看这个:

代码语言:javascript
复制
>>>''.join( str(_) for _ in xrange(10) )
'0123456789'

现在,join的论点是str(_) for _ in xrange(10),没有[],但结果是相同的。

为什么?str(_) for _ in xrange(10)是否也产生一个列表或一个迭代器?

EN

回答 3

Stack Overflow用户

发布于 2012-01-30 15:35:51

您的第二个示例使用生成器表达式而不是列表理解。不同之处在于,通过列表理解,可以完全构建列表并将其传递给.join()。使用生成器表达式,项将一个接一个地生成并由.join()使用。后者使用的内存更少,而且通常更快。

碰巧的是,列表构造函数将愉快地使用任何可迭代对象,包括生成器表达式。所以:

代码语言:javascript
复制
[str(n) for n in xrange(10)]

只是“语法糖”的意思:

代码语言:javascript
复制
list(str(n) for n in xrange(10))

换句话说,列表理解只是一个生成器表达式,它被转换为列表。

票数 5
EN

Stack Overflow用户

发布于 2012-01-30 15:33:22

这是一个生成器,而不是一个列表理解。生成器也是可迭代的,但它不是先创建整个列表,然后将其传递给join,而是逐个传递xrange中的每个值,这样效率会高得多。

票数 1
EN

Stack Overflow用户

发布于 2012-01-30 15:33:35

第二个join调用的参数是一个生成器表达式。它确实产生了一个可迭代的。

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

https://stackoverflow.com/questions/9060653

复制
相关文章

相似问题

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