在迭代器中复制每个成员

时间:2016-03-15 04:22:44

标签: python iterator

给定一个迭代器i,我想要一个迭代器,它产生每个元素n次,即相当于这个函数

def duplicate(i, n):
    for x in i:
        for k in range(n):
            yield x

这是否有单行?

相关问题:duplicate each member in a list - python,但zip解决方案无效。

3 个答案:

答案 0 :(得分:6)

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

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,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,   8,9,9,9]

答案 1 :(得分:3)

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]

答案 2 :(得分:1)

使用生成器表达式:

>>> 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]