如何创建一个生成特定数量值的生成器函数?

问题描述 投票:0回答:1

我正在尝试创建一个接受1或1+个参数的生成器函数。在其他可迭代对象不再产生值之后,它应该返回具有最多值的可迭代对象的剩余超值的可迭代对象。

例如:

 for i in func('dfg', 'dfghjk', [1,2]):
    print(i)

prints -> h
          j
          k

因为参数'dfg'具有第二大的值,所以在3处不再产生值。具有最大值的参数'dfghjk'然后产生'hjk'(剩余值)。

这里的难点是,可迭代对象可能是有限的,也可能不是有限的,所以我无法计算参数的长度或将其添加到其他数据结构中。

任何帮助都会很棒,谢谢!

python generator
1个回答
0
投票

为了解决您的问题,我将尝试手动耗尽所有迭代器,直到仅剩一个为止。

def foo(*iterables):
    iterators = [iter(x) for x in iterables]
    while len(iterators) > 1:
        for idx, it in enumerate(iterators[:]):
            try:
                peek = next(it)
            except StopIteration:
                # remove the iterator when exhausted
                iterators.pop(idx)

    yield peek
    yield from iterators[0]

注意,要使其正常工作,您需要确保可迭代对象确实是迭代器(使用iter进行转换)。您还需要存储从迭代器获得的最后一个元素。注意,因为我们仅使用迭代器接口,所以无限迭代器可以正常工作:

>>> it = func([1], itertools.count(), [2,2])
>>> for _ in range(3): print(next(it))
2
3
4
© www.soinside.com 2019 - 2024. All rights reserved.