在 Python 中迭代第一次迭代

Posted

技术标签:

【中文标题】在 Python 中迭代第一次迭代【英文标题】:Iterating over first iteration in Python 【发布时间】:2014-08-04 10:13:12 【问题描述】:

是否有单行或 Pythonic(我知道前者不一定暗示后者)的方式来编写以下嵌套循环?

for i in some_list:
    for j in i:
        # do something

我试过了

import itertools
for i,j in itertools.product(some_list,i):
    # do something

但我得到一个“分配错误之前的参考”,我认为这是有道理的。到目前为止,我一直无法找到这个问题的答案......有什么建议吗?谢谢!

【问题讨论】:

使用列表补全,它将用作在线而不是 Python 方式的循环。 @Lafada:嵌套列表推导式并不是 Python 式的(它们可能难以阅读), 无论如何,使用列表推式来处理副作用绝对是非 Python 式的。跨度> 【参考方案1】:

如果您想依次遍历some_list 中的每个子列表,您可以使用itertools.chain

for j in itertools.chain(*some_list):

一个简短的演示:

>>> import itertools
>>> some_list = [[1, 2], [3, 4]]
>>> for j in itertools.chain(*some_list):
    print j


1
2
3
4

另外还有chain.from_iterable:

>>> for j in itertools.chain.from_iterable(some_list):
    print j


1
2
3
4

(除了细微的语法变化,请参阅this question 了解差异的解释。)

【讨论】:

你的意思是我还能用这个做字典吗?我可以看到它如何用于列表列表,但看不到它如何用于字典列表。请给我看看好吗? 答案是“视情况而定”。对于你想要做的事情,不,虽然如果你只是想遍历列表值,你可以做for j in itertools.chain.from_iterable(map(itemgetter("some_key"), some_list)): print j【参考方案2】:

使用链:

import itertools


some_list = [[1,2,3,4],[3,4,5,6]]

for i in itertools.chain(*some_list):
    print i
1
2
3
4
3
4
5
6

【讨论】:

以上是关于在 Python 中迭代第一次迭代的主要内容,如果未能解决你的问题,请参考以下文章

Python:为啥这个 for 循环在第一次迭代后退出?

Python多处理,在循环中多次使用池在第一次迭代后卡住

Lambda 作为 Python 中的迭代器在第一次迭代时返回函数对象

Python:在外循环中继续下一次迭代

Python for 循环在第一次迭代后停止

For循环中的Python最后一次迭代