Ответ 1
Не использовать вложенные циклы; вы соединяете A
и B
, при этом B
повторяется по мере необходимости. Вам нужно zip()
(чтобы сделать сопряжение) и itertools.cycle()
(повторить B
):
from itertools import cycle
zip(A, cycle(B))
Если B
всегда будет в два раза меньше A
, вы также можете просто удвоить B
:
zip(A, B + B)
Демо:
>>> from itertools import cycle
>>> A = [70, 60, 50, 40, 30, 20, 10, 0]
>>> B = [1, 2, 3, 4]
>>> zip(A, cycle(B))
[(70, 1), (60, 2), (50, 3), (40, 4), (30, 1), (20, 2), (10, 3), (0, 4)]
>>> zip(A, B + B)
[(70, 1), (60, 2), (50, 3), (40, 4), (30, 1), (20, 2), (10, 3), (0, 4)]
В тех случаях, когда неизвестно, какой из них является более длинным списком, вы можете использовать min()
и max()
, чтобы выбрать, какой из циклов:
zip(max((A, B), key=len), cycle(min((A, B), key=len))
или для произвольного количества списков, чтобы скомпилировать их, используйте их itertools.islice()
, чтобы ограничить максимальную длину:
inputs = (A, B) # potentially more
max_length = max(len(elem) for elem in inputs)
zip(*(islice(cycle(elem), max_length) for elem in inputs))
Демо:
>>> from itertools import islice
>>> inputs = (A, B) # potentially more
>>> max_length = max(len(elem) for elem in inputs)
>>> zip(*(islice(cycle(elem), max_length) for elem in inputs))
[(70, 1), (60, 2), (50, 3), (40, 4), (30, 1), (20, 2), (10, 3), (0, 4)]