Ответ 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 ...
Я понимаю, что использование генератора - лучший способ добиться чего-то подобного, но я открыт для предложений.
В частности, используется один случай: я хотел бы напечатать некоторые элементы рядом с другим списком, произвольной длины, по мере необходимости урезая начальный итератор.
Вот рабочий код 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__
(если я не ошибаюсь). В идеале, я хотел бы иметь возможность передавать любую итерабельную информацию и получать генератор, который может правильно контактировать его содержимое.
Если есть лучший способ сделать что-то вроде этого без генератора, я в порядке с этим.
Вы можете использовать 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 ...
Попробуйте 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 ...
Вы можете перебирать список, добавляя к нему элемент:
somelist = [item1, item2, item3]
for item in somelist:
somelist.append(item)
do_something()