我想要一个通过值列表无限循环的生成器。
这是我的解决方案,但我可能会错过一个更明显的解决方案。
成分:一个生成器函数,用于展平无限嵌套列表,以及自身列表附件
def ge(x):
for it in x:
if isinstance(it, list):
yield from ge(it)
else:
yield(it)
def infinitecyclegenerator(l):
x = l[:]
x.append(x)
yield from ge(x)
使用:
g = infinitecyclegenerator([1,2,3])
next(g) #1
next(g) #2
next(g) #3
next(g) #1
next(g) #2
next(g) #3
next(g) #1
...
正如我所说,我可能会错过一个琐碎的方式来做同样的事情,我会很乐意学习。有更简洁的方式吗?
另外,我是否应该担心内存耗尽,这里有令人难以置信的无穷无尽的信息,或者我的代码是否一切都很酷?
答案 0 :(得分:7)
您可以使用itertools.cycle
来获得相同的结果
使迭代器从iterable返回元素并保存a 每个的副本。当iterable耗尽时,返回from中的元素 已保存的副本。
强调我的。您对内存的唯一顾虑是保存迭代器返回的每个项目的副本。
>>> from itertools import cycle
>>> c = cycle([1,2,3])
>>> next(c)
1
>>> next(c)
2
>>> next(c)
3
>>> next(c)
1
>>> next(c)
2
>>> next(c)
3
答案 1 :(得分:0)
必须是小时:-)。发布后我意识到的一种显而易见的方式:
def infinitecyclegenerator(l):
while True:
for it in l:
yield it
很抱歉错过了显而易见的事。