Как создать функцию-генератор, которая производит определенное c количество значений? - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь создать функцию генератора, которая принимает 1 или 1+ аргументов. Он должен возвращать итерацию левых превышений итераций с наибольшим количеством значений после того, как другие итерации больше не производят значений.

Например:

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

prints -> h
          j
          k

, потому что аргумент 'dfg', который имеет второе по величине значение, перестанет генерировать значения на 3. Аргумент dfghjk, который имеет наибольшее количество значений, затем выдает hjk (оставшиеся значения). или не может быть конечным, поэтому я не могу вычислить длину аргумента или добавить его в другие структуры данных.

Любая помощь была бы замечательной, спасибо!

1 Ответ

0 голосов
/ 28 мая 2020

Чтобы решить вашу проблему, я бы попытался вручную исчерпать все итераторы, пока не останется только один.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...