Предполагая, что длина A
кратна B
, вы можете легко сделать
>>> scale = len(A) // len(B)
>>> [(a, B[i // scale]) for i, a in enumerate(A)]
[('a', 1),
('b', 1),
('c', 1),
('d', 2),
('e', 2),
('f', 2),
('g', 3),
('h', 3),
('i', 3)]
Как это работает:
- Определить значение
k
такой, что len(A) == k * len(B)
- Выполните итерацию по
A
и используйте k
, чтобы определить, какое значение B
выбрать, поделив на него текущий индекс, соответственно
Если длины не кратны, то получится
IndexError: list index out of range
. Вы можете обойти это, вычислив scale
, чтобы быть
scale = len(A) // len(B) * len(B)
Например,
A = ["a", "b", "c", "d", "e", "f", "g", "h"]
B = [1, 2, 3]
>>> scale = len(A) // len(B) * len(B)
>>> [(a, B[i // scale]) for i, a in enumerate(A)]
[('a', 1),
('b', 1),
('c', 1),
('d', 1),
('e', 1),
('f', 1),
('g', 2),
('h', 2)]
Вот функциональный подход с использованием itertools
repeat
и chain.from_iterable
.
>>> from itertools import repeat, chain
>>> list(zip(A, chain.from_iterable(zip(*repeat(B, scale)))))
[('a', 1),
('b', 1),
('c', 1),
('d', 2),
('e', 2),
('f', 2),
('g', 3),
('h', 3),
('i', 3)]