Проход по массивам разного размера одновременно
Столкнулся с такой проблемой: нужно выводить в цикле элементы всех массивов по одному с каждого, но у каждого массива свой размер. И, массив с меньшим количеством элементов подходит к концу, нужно начать выводить его элементы сначала, но продолжать выводить элементы других массивов. Пример:
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))