我正在尝试创建一个接受1或1+个参数的生成器函数。在其他可迭代对象不再产生值之后,它应该返回具有最多值的可迭代对象的剩余超值的可迭代对象。
例如:
for i in func('dfg', 'dfghjk', [1,2]):
print(i)
prints -> h
j
k
因为参数'dfg'具有第二大的值,所以在3处不再产生值。具有最大值的参数'dfghjk'然后产生'hjk'(剩余值)。
这里的难点是,可迭代对象可能是有限的,也可能不是有限的,所以我无法计算参数的长度或将其添加到其他数据结构中。
任何帮助都会很棒,谢谢!
为了解决您的问题,我将尝试手动耗尽所有迭代器,直到仅剩一个为止。
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