Как создать генератор продолжает идти после StopIteration? - PullRequest
0 голосов
/ 08 февраля 2019

Если у меня есть несколько итераций в качестве аргумента, и есть ли способ сохранить выполнение кода после того, как один из списков вызовет 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Я только печатал первый список:

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

Каков наилучший способ получить такой результат?Resutls - это кортежи в списке, и когда аргументы итераций заканчиваются, они заменяются на Nones.

[('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

Любойпредложение или помощь будут оценены!

1 Ответ

0 голосов
/ 08 февраля 2019

Вы можете использовать второй параметр 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)]
...