Python 在迭代器中复制每个成员

Python 在迭代器中复制每个成员,python,iterator,Python,Iterator,给定一个迭代器i,我需要一个迭代器,它可以生成每个元素n次,即此函数的等价项 def duplicate(i, n): for x in i: for k in range(n): yield x 这有一条班轮吗 相关问题:,但是zip解决方案在这里不起作用 itertools.chain.from_iterable(itertools.izip(*itertools.tee(source, n))) 例如: >>> x =

给定一个迭代器
i
,我需要一个迭代器,它可以生成每个元素
n
次,即此函数的等价项

def duplicate(i, n):
    for x in i:
        for k in range(n):
            yield x
这有一条班轮吗

相关问题:,但是
zip
解决方案在这里不起作用

itertools.chain.from_iterable(itertools.izip(*itertools.tee(source, n)))
例如:

>>> x = (a**2 for a in xrange(5))
>>> list(itertools.chain.from_iterable(itertools.izip(*itertools.tee(x, 3))))
[0, 0, 0, 1, 1, 1, 4, 4, 4, 9, 9, 9, 16, 16, 16]
另一种方式:

itertools.chain.from_iterable(itertools.repeat(item, n) for item in source)

>>> x = (a**2 for a in xrange(5))
>>> list(itertools.chain.from_iterable(itertools.repeat(item, 3) for item in x))
[0, 0, 0, 1, 1, 1, 4, 4, 4, 9, 9, 9, 16, 16, 16]

使用生成器表达式:

>>> x = (n for n in range(4))
>>> i = (v for v in x for _ in range(3))
>>> list(i)
[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]

这是我的简单解决方案,如果您想将每个元素复制相同的时间。它返回一个生成器表达式,该表达式应该是内存有效的

def duplicate(i, n):
    return (k for k in i for j in range(n))
一个示例用法可以是

print (list(duplicate(range(1, 10), 3)))
它打印

[1,1,1,2,2,3,3,4,4,5,5,6,6,7,7,7,8,8, 8、9、9、9]


不要将参数星号设置为
itertools.chain()
。改用
itertools.chain.from\u iterable()
。这是同一回事吗?我的意思是,根据所讨论的函数,他多次调用call
duplicate
函数,每个元素的编号不同。感谢
tee
配方!文档中说“这个(
tee
)itertool可能需要大量的辅助存储”,但在这个实际的使用案例中,它看起来还可以吗?你能解释一下吗?@TonyBetaLambda:如文档中所述,
tee
如果你使用了大量的一个副本,而不使用其他副本,那么会占用大量的存储空间。在本例中,这不是一个问题,因为所有副本都是同步推进的(即,在从任何副本中获取第二个元素之前,从所有副本中获取第一个元素)。“这是内存有效的”,实际上比生成器函数的内存效率更高,因为表达式不需要相同类型的python命名空间。生成器函数是什么?类似于OPoh I中的
yield
语句的函数可能是错误的: