首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >列表理解中的双重迭代

列表理解中的双重迭代
EN

Stack Overflow用户
提问于 2009-07-29 16:30:50
回答 7查看 248.5K关注 0票数 313

在Python中,在一个列表理解中可以有多个迭代器,例如

代码语言:javascript
复制
[(x,y) for x in a for y in b]

对于一些合适的序列a和b,我知道Python的列表理解的嵌套循环语义。

我的问题是:理解中的一个迭代器可以引用另一个迭代器吗?换句话说:我可以有这样的东西吗:

代码语言:javascript
复制
[x for x in a for a in b]

其中外部循环的当前值是内部循环的迭代器?

举个例子,如果我有一个嵌套列表:

代码语言:javascript
复制
a=[[1,2],[3,4]]

为了达到这个结果,列表理解表达式应该是什么:

代码语言:javascript
复制
[1,2,3,4]

??(请只列出理解答案,因为这是我想找出的答案)。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-07-29 08:34:29

天啊,我想我找到了答案:我没有足够注意到哪个循环是内部的,哪个是外部的。列表理解应该是这样的:

代码语言:javascript
复制
[x for b in a for x in b]

为了得到想要的结果,一个当前值可以作为下一个循环的迭代器。

票数 148
EN

Stack Overflow用户

发布于 2009-07-29 08:36:21

用你自己的建议回答你的问题:

代码语言:javascript
复制
>>> [x for b in a for x in b] # Works fine

虽然您要求列表理解答案,但让我也指出优秀的itertools.chain():

代码语言:javascript
复制
>>> from itertools import chain
>>> list(chain.from_iterable(a))
>>> list(chain(*a)) # If you're using python < 2.6
票数 192
EN

Stack Overflow用户

发布于 2016-10-05 17:39:42

迭代器的顺序可能看起来有悖于直觉。

举个例子:[str(x) for i in range(3) for x in foo(i)]

让我们分解它:

代码语言:javascript
复制
def foo(i):
    return i, i + 0.5

[str(x)
    for i in range(3)
        for x in foo(i)
]

# is same as
for i in range(3):
    for x in foo(i):
        yield str(x)
票数 61
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1198777

复制
相关文章

相似问题

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