Проход по массивам разного размера одновременно

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

array1 = [1, 2, 3]
array2 = [1, 2, 3, 4, 5]
array3 = [1]

Нужен вывод 10 элементов таким образом:

1 1 1
2 2 1
3 3 1
1 4 1
2 5 1
3 1 1
1 2 1
2 3 1
3 4 1
1 5 1

Спасибо заранее.


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

Автор решения: strawdog

Ну вот вам для примера:

import itertools

a = [1, 2, 3]
b = [1, 2, 3, 4, 5]
c = [1]

rep = 10

ca = itertools.cycle(a)
cb = itertools.cycle(b)
cc = itertools.cycle(c)


while rep:
    print(f"{next(ca)} {next(cb)} {next(cc)}")
    rep-=1

На выходе:

1 1 1
2 2 1
3 3 1
1 4 1
2 5 1
3 1 1
1 2 1
2 3 1
3 4 1
1 5 1
→ Ссылка
Автор решения: passant

Вариант с помощью базового Python без привлечения дополнительных библиотек:

array1 = [1, 2, 3]
array2 = [1, 2, 3, 4, 5]
array3 = [1]

ls1 = len(array1)
ls2 = len(array2)
ls3 = len(array3)

for i in range(10):
    print (array1[i % ls1],array2[i % ls2],array3[i % ls3])

Результат:

1 1 1
2 2 1
3 3 1
1 4 1
2 5 1
3 1 1
1 2 1
2 3 1
3 4 1
1 5 1
→ Ссылка
Автор решения: Sergey Gornostaev
from itertools import cycle, takewhile

a = [1, 2, 3]
b = [1, 2, 3, 4, 5]
c = [1]

max_len = max(map(len, [a, b, c]))
it = enumerate(zip(*map(cycle, [a, b, c])))

for n, v in takewhile(lambda i: i[0] < max_len, it):
    print(*v)
→ Ссылка
Автор решения: vadim vaduxa
from itertools import cycle

a = [1, 2, 3]
b = [1, 2, 3, 4, 5]
c = [1]

max_len = max(map(len, [a, b, c]))
it = list(map(cycle, [a, b, c]))
while max_len:
    max_len -= 1
    print(*map(next, it))
→ Ссылка