Вот подход, основанный на itertools
, который также работает для произвольного числа элементов, которые нужно вставить из одного списка в другой.Для этого я определил функцию генератора, которая будет вставлять элемент l2
в l1
каждые i
элементов:
def insert_n(l1, l2, i):
while True:
try:
yield from islice(l1, i)
yield next(l2)
except StopIteration:
return
Это работает, давая до i
элементы из итератора l1
на каждой итерации, используя itertools.islice
.С yield from
мы получаем столько элементов, сколько есть в итерируемой части, поэтому итерация запускается до истощения (сокращение для for v in g: yield v
).
Наконец мы можемоберните операторы yield
try
/ expect
, чтобы перехватить предупреждение StopIteration
.
Давайте попробуем с предложенным примером:
vector = iter([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
inserted_elements = iter([2, 2, 2, 2, 2])
list(insert_every_n(vector, inserted_elements, i=2))
# [1, 2, 2, 3, 4, 2, 5, 6, 2, 7, 8, 2, 9, 10, 2]
И еслимы хотели добавить элемент l2
каждые 3 элемента:
vector = iter([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
inserted_elements = iter([2, 2, 2, 2])
list(insert_every_n(vector, inserted_elements, i=3))
# [1, 2, 3, 2, 4, 5, 6, 2, 7, 8, 9, 2, 10, 2]