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