首页 > 解决方案 > 带有压缩迭代器的 itertools.chain

问题描述

我有 3 台发电机如下

g1 = ((i, i) for i in range(3))
g2 = ((i, i ** 2) for i in range(3))
g3 = ((i, i ** 3) for i in range(3))

我想将它们链接在一起(并行)以获得类似(i,i,i,i 2,i,i 3)的输出。以下是 2 个代码,一个有效,另一个无效。谁能帮我理解为什么第二种方法不能按计划工作?我不太完全理解 Python 在压缩迭代器时会做什么。

这是有效的代码:

from itertools import chain

def combo(iters):
    zipped_tuples = zip(*iters)
    for zipped_tuple in zipped_tuples:
        yield tuple(chain.from_iterable(zipped_tuple))

c = combo((g1, g2, g3))
for item in c:
    print(item)

输出如下

(0, 0, 0, 0, 0, 0)
(1, 1, 1, 1, 1, 1)
(2, 2, 2, 4, 2, 8)

这是不起作用的代码

from itertools import chain

g1 = ((i, i) for i in range(3))
g2 = ((i, i ** 2) for i in range(3))
g3 = ((i, i ** 3) for i in range(3))

def combo(iters):
    zipped_tuples = chain.from_iterable(zip(*iters))
    yield from zipped_tuples

c = combo((g1, g2, g3))
for item in c:
    print(item)

输出不是并行链接,而是串行链接,如下所示:

(0, 0)
(0, 0)
(0, 0)
(1, 1)
(1, 1)
(1, 1)
(2, 2)
(2, 4)
(2, 8)

标签: pythonitertools

解决方案


推荐阅读