首页 > 解决方案 > 仅使用 itertools 重复迭代中的每个元素(可以是无限的)

问题描述

以下是否有更简单的表达式,可以使用itertools而不需要定义函数?

它必须支持任何可迭代的,包括来自生成器的无限序列。

我查看了https://docs.python.org/3/library/itertools.html中的食谱,并没有发现任何明显的东西。

def repeat_each(iterable, n):
    """Repeat each element in iterable n times"""
    it = iter(iterable)
    for element in it:
      for _ in range(n):
        yield element

a = itertools.cycle('abcd')
b = repeat_each(a, 4)
print(''.join(itertools.islice(b, 30)))
# Output: 'aaaabbbbccccddddaaaabbbbccccdd'

标签: pythonitertools

解决方案


我不确定它是否涵盖了您想到的所有情况,但是您可以使用tee(复制迭代器n时间)然后zipchain

from itertools import tee, chain, cycle, islice

a = cycle('abcd')
b = chain.from_iterable(zip(*tee(a, 4)))
print(''.join(islice(b, 30)))

结果:

aaaabbbbccccddddaaaabbbbccccdd

推荐阅读