如果我有多个Iterables作为参数,并且在列表之一引发StopIteration之后,有什么方法可以使代码继续运行?

我不能使用任何切片,len()或任何itertools。

到目前为止,这是我尝试过的方法,我知道这是完全错误的,但是我无法弄清楚。

def together(*args):
    iterator = [iter(item) for item in args]
    my_list = []

    while True:
            for i in iterator:
                try:
                    lst.append(next(i))
                    print(next(i))
                except StopIteration:
                    return
            if '__next__' == None:
                yield tuple(None)
            else:
                yield tuple(my_list)
            my_list = []


这是我当前的结果,它确实存储了b,g,i,但它只打印出第一个列表:

[('a', 'f', 'h')]


获得这样的结果的最佳方法是什么?
结果是列表中的元组,当参数iterables用尽时,它将替换为None。

[('a', 'f', 'h'), ('b', 'g', 'i'), ('c', None, 'j'), ('d', None, 'k'), ('e', None, None)]


我知道StopIteration错误在('b','g','i')之后出现,但是有什么办法可以忽略并继续使用其他列表吗?

输入看起来像:

[v for v in together(disguise('abcde'), disguise('fg'), disguise('hijk'))]


伪装功能如下:

def disguise(items):
    for v in items:
        yield v


任何建议或帮助将不胜感激!

最佳答案

您可以使用next的第二个参数让next返回默认值,而不是在耗尽给定迭代器时引发StopIteration异常:

def together(*seqs):
    seqs = list(map(iter, seqs))
    while True:
        group = tuple(next(seq, None) for seq in seqs)
        if all(i is None for i in group):
            return
        yield group


以便:

list(together('abcde', 'fg', 'hijk'))


返回:

[('a', 'f', 'h'), ('b', 'g', 'i'), ('c', None, 'j'), ('d', None, 'k'), ('e', None, None)]

关于python - 在StopIteration之后,如何创建Generator会继续下去?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54583540/

10-10 21:36