Как вывести элементы из списка несколько раз в Python?

Всем привет. Есть список:

['1_собака', '2_кошка', '3_попугай', '4_медведь']

Я хочу вывести в print что-то вроде:

'собака', 'кошка', 'попугай', 'медведь', 'собака', 'кошка', 'попугай', 'медведь', 'собака', 'кошка'

Делаю так:

listtest = ['1_собака', '2_кошка', '3_попугай', '4_медведь']

lgo = [listtest[i] for i in range(50)]

print(lgo)

И мне выдается ошибка: IndexError: list index out of range, что логично. Ведь количество элементов в списке доходит только до 3. Вопрос - как сделать, чтобы элементы начинали перебираться заново, если выходят за рамки нумерации?


Ответы (4 шт):

Автор решения: Эникейщик

Способ 1:

lgo = []
for i in range (50):
    idx = 0
    lgo.append(listtest[idx])
    idx += 1
    if idx == len(listtest):
        idx = 0

Способ 2:

lgo = [listtest[i % len(listtest)] for i in range(50)]

Способ 3:

m = 50 // len(listtest) + 1
lgo = listtest * m
lgo = lgo[:50]
→ Ссылка
Автор решения: Алексей Р

4 способ - "бесконечное FIFO"

lst = ['собака', 'кошка', 'попугай', 'медведь']
for _ in range(50):
    print(e := lst.pop(0))
    lst.append(e)
собака
кошка
попугай
медведь
собака
кошка
попугай
...
→ Ссылка
Автор решения: TigerTV.ru

В одну строку:

any(map(lambda _: any(map(print, listtest)), range(5)))

в 2 строки:

for _ in range(5):
    any(map(print, listtest))

Можно воспользоваться cycle:

from itertools import cycle

listtest = ['собака', 'кошка', 'попугай', 'медведь']
it = cycle(listtest)
for _ in range(50):
    print(next(it))
→ Ссылка
Автор решения: SergFSM

с использованием модуля itertools это может выглядеть так:

from itertools import cycle, islice

l =  ['собака', 'кошка', 'попугай', 'медведь']
list(islice(cycle(l),10))

>>> out
'''
['собака',
 'кошка',
 'попугай',
 'медведь',
 'собака',
 'кошка',
 'попугай',
 'медведь',
 'собака',
 'кошка']
→ Ссылка