微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决循环遍历嵌套生成器一次并重复

我想通过 2 个不同的 itertools.count 屈服。我把两者结合起来 使用 itertools.chain.from_iterable

生成

这是我为它编写的代码

return itertools.chain.from_iterable([itertools.count(start=2,step=2),itertools.count(start=7,step=7)])

问题是它试图在处理下一个计数器(第 7 步)之前完成第一个计数器(第 2 步)

上述示例代码输出

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,count(start=7,step=7),])

gen = pattern_generator()

print(next(gen)())
print(next(gen)())
print(next(gen)())
print(next(gen)())

我对这个输出很满意。但是,是否可以在不调用 iter 的 next 方法的情况下调用 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('a',0),('b',1) ... 序列)
所以这大致转化为 itertools.chain.from_iterable([('a',1),...])
调用 chain.from_iterable 类似于调用 chain
所以现在我们有chain(('a',('c',2))
由于 tuple 是可迭代的,chain 遍历 ('a',0),然后 ('b',1) 等等
from_iterablezip 都是需要的,因为它们实际上都没有创建列表 [('a',...](在您的情况下是无限的)

功能一

def alternate(*iterables):
    for t in zip(*iterables):
        yield from t # or for i in t: yield i

功能 2

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

函数方法也提供了更大的灵活性

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?