python - 循环遍历嵌套生成器一次并重复

标签 python generator itertools

我想通过 2 个不同的 itertools.count 让步.我把两者结合了
使用 itertools.chain.from_iterable 的生成器
这是我为它编写的代码。

return itertools.chain.from_iterable([itertools.count(start=2, step=2), itertools.count(start=7, step=7)])
问题是它试图完成第一个计数器(步骤 2),然后再处理下一个计数器(步骤 7)
上述示例代码的输出:
2
4
6
8
10
...
但我想交替循环。
预期输出:
2  # 2*1
7  # 7*1
4  # 2*2
14 # 7*2
6  # 2*3
21 # 7*3
8  # 2*4
28 # 7*4
以下是我迄今为止尝试过的其他方法:
yield from [elem for elem in [next(count(start=2, step=2)), next(count(start=7, step=7))]]
上述循环交替,但计数器在每次产量后重置。
上述代码示例的输出:
2
7
2
7
2
7
我希望这完全在 itertools 上实现或列表理解
因为它们是内存优化的,所以我希望函数返回一个 generator object .此外,如果解决方案在单行上会更好。
编辑:
正如 jonrsharpe 所建议的那样在评论中,我已经实现了roundrobin iter 技术,我能够获取所需的输出。
from itertools import count, cycle

def pattern_generator():
    return cycle(iter(it).__next__ for it in [
        count(start=2, step=2),
        count(start=7, step=7),
    ])

gen = pattern_generator()

print(next(gen)())
print(next(gen)())
print(next(gen)())
print(next(gen)())
我对这个输出很满意。但是,可以调用next吗?不调用迭代器的下一个方法?即,不使用 ()next(gen)() ?
提前致谢。

最佳答案

您可以通过各种方式制作生成器
排队

#for i in (i for t in zip('abc',range(3)) for i in t):
#EDIT: more readable solution
for i in itertools.chain.from_iterable(zip('abc',range(3))):
    print(i)
编辑2:解释zip连接每个可迭代的第 n 个(返回 tuple s ('a', 0), ('b', 1) ... 的序列)
所以这大致翻译为itertools.chain.from_iterable([('a', 0), ('b', 1), ...])调用chain.from_iterable类似于调用 chain所以现在我们有 chain(('a', 0), ('b', 1), ('c', 2))自从 tuple s 是可迭代的,chain遍历 ('a', 0) ,然后是 ('b', 1)等等from_iterablezip两者都需要,因为两者都没有实际创建列表 [('a', 0), ('b', 1), ...] (在你的情况下将是无限的)
功能一
def alternate(*iterables):
    for t in zip(*iterables):
        yield from t # or for i in t: yield i
功能二
def alternate(*iterables):
    iterables = [iter(it) for it in iterables]
    while True:
        try:
            for it in iterables:
                yield next(it)
        except StopIteration:
            break
结果
for i in alternate('abc', range(3)):
    print(i)
a
0
b
1
c
2
函数方法也提供了更大的灵 active

关于python - 循环遍历嵌套生成器一次并重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67946925/

相关文章:

python - 如何构建 python 函数结果的通用总和

python - 为什么要使用 Python 交互模式?

typescript - TypeScript 中可迭代对象的可变参数压缩

python - 在 Python 中安全地循环遍历同一生成器中的生成器吗?

python - 列表理解从元组列表中提取多个字段

Python - n维立方体的角坐标

python - Django cms - 尝试在页面列表上发布或取消发布页面时出现 Javascript "undefined"字符串警报错误

python - 订阅 Microsoft Office 365 管理事件 API : Authorization denied

Python:copy.deepcopy 产生错误

python - 如何在Python中改善列表上的模式匹配