我想通过 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_iterable
和 zip
两者都需要,因为两者都没有实际创建列表 [('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/