【发布时间】:2016-06-30 09:11:48
【问题描述】:
给定一个迭代器 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 解决方案在这里不起作用。
【问题讨论】:
给定一个迭代器 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 解决方案在这里不起作用。
【问题讨论】:
如果您想同时复制每个元素,这是我的简单解决方案。它返回一个生成器表达式,它应该是内存高效的。
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, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8、9、9、9]
【讨论】:
yield 语句类似在 OP
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]
【讨论】:
itertools.chain() 加注星标。请改用itertools.chain.from_iterable()。
duplicate 函数,每个元素使用不同的数字。
tee 食谱!文档说“这个 (tee) itertool 可能需要大量的辅助存储”,但在这个实际用例中似乎还可以?你能解释一下吗?
tee 将使用大量存储空间,如果您使用其中一个重复项而不使用其他重复项。在此示例中,这不是问题,因为所有重复项都是同步推进的(即,您先从所有重复项中获取第一个元素,然后再从其中任何一个中获取第二个元素)。
使用生成器表达式:
>>> 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]
【讨论】: