【发布时间】:2016-11-17 14:08:05
【问题描述】:
我想创建生成器,它可以以无穷无尽的方式即时(连续地)合并来自可迭代对象的值。
主要思想是,当您询问时,该生成器每次都会将值生成到输出中。因此,主要功能是无限循环,您可以在其中一个一个地向生成器询问值并将它们打印到输出中。
虽然值来自迭代器,但生成器会一一返回值以将它们打印到输出中。
现在,在我的代码中,我将值传递到一个列表中。但没有必要在打印之前将所有值收集到一个列表中。
def merge(*iterables):
# create a generator
generator = (iter(current) for current in iterables)
# convert generator to a list
iters = list(generator)
# while we have a iterable
while iters:
#loop through each iterable
for i in iters:
try:
# yields the values one by one
yield i.__next__()
except StopIteration:
iters.remove(i)
当我这样跑步时:
>>> callmerge([1,5,9],[2,5],[1,6,10,11])
Result is:
[1, 1, 2, 5, 5, 6, 9, 10, 11]
为了清楚,我有一个例子:
让我们想象一下,我们正在从几个黑盒子中取出带有数字的球(如宾果游戏)。
我们真的不知道每个盒子里有多少球。我们可以一个一个地从盒子里取出球。
我们知道,来自同一个黑盒子的每个下一个球的编号都会比前一个大。
所以,我们应该从黑匣子中取出球,并在每一步都给我们的助手一个编号最小的球。
所以,我的问题是如何创建生成器,它可以以无穷无尽的方式即时(连续地)合并来自可迭代对象的值? (由于内存,我也不会使用列表-我知道也许 itertools.chain(*iterables) 是不错的选择,但不知道如何使用)
【问题讨论】:
-
您可以阅读 itertools.chain 上的文档...
标签: python