Как я могу бесконечно петли итератор в Python, через генератор или другой?

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

В частности, используется один случай: я хотел бы напечатать некоторые элементы рядом с другим списком, произвольной длины, по мере необходимости урезая начальный итератор.

Вот рабочий код python, который демонстрирует точный пример поведения, который я хочу:

    def loop_list(iterable):
        """
        Return a Generator that will infinitely repeat the given iterable.

        >>> l = loop_list(['sam', 'max'])
        >>> for i in range(1, 11):
        ...     print i, l.next()
        ... 
        1 sam
        2 max
        3 sam
        4 max
        5 sam
        6 max
        7 sam
        8 max
        9 sam
        10 max

        >>> l = loop_list(['sam', 'max'])
        >>> for i in range(1, 2):
        ...     print i, l.next()
        ... 
        1 sam
        """
        iterable = tuple(iterable)
        l = len(iterable)
        num = 0
        while num < l:
            yield iterable[num]
            num += 1
            if num >= l:
                num = 0

Проблема/Мой вопрос

Как вы могли заметить, это работает только в списках /tuples/iterables, которые реализуют __getitem__ (если я не ошибаюсь). В идеале, я хотел бы иметь возможность передавать любую итерабельную информацию и получать генератор, который может правильно контактировать его содержимое.

Если есть лучший способ сделать что-то вроде этого без генератора, я в порядке с этим.

Ответ 1

Вы можете использовать itertools.cycle (источник включен на связанную страницу).

import itertools

a = [1, 2, 3]

for element in itertools.cycle(a):
    print element

# -> 1 2 3 1 2 3 1 2 3 1 2 3 ...

Ответ 2

Попробуйте this-

L = [10,20,30,40]

def gentr_fn(alist):
    while 1:
        for j in alist:
            yield j

a = gentr_fn(L)
print a.next()
print a.next()
print a.next()
print a.next()
print a.next()
print a.next()
print a.next()

>>gentr_fn(x,y)
10 20 30 40 10 20 30 ...

Ответ 3

Вы можете перебирать список, добавляя к нему элемент:

somelist = [item1, item2, item3]
for item in somelist:
    somelist.append(item)
    do_something()