Определите функцию interleaved_tuple_two
, которая принимает два аргумента, tuple_a
и tuple_b
, которая возвращает набор чередующихся значений, которые чередуют одно значение tuple_b
для каждых двух значений tuple_a
. Предполагая, что tuple_a
всегда вдвое больше tuple_b
.
Например:
tuple_a = (1,3,5,7,9,11,13,15)
tuple_b = (2,4,6,8)
interleaved_tuple_two(tuple_a, tuple_b)
вернется:
(1, 3, 2, 5, 7, 4, 9, 11, 6, 13, 15, 8)
В настоящее время у меня есть это, но это неправильно. Не слишком уверен, как улучшить это
def interleaved_tuple_two(tuple_a, tuple_b):
return [val for pair in zip(tuple_a, tuple_b) for val in pair]
Вы можете использовать zip с тремя списками, первые два имеют tuple_a
пропуск одного значения за раз, но имеют разные начальные позиции, а третий — tuple_b
.
tuple_a = (1, 3, 5, 7, 9, 11, 13, 15)
tuple_b = (2, 4, 6, 8)
tuple_c = tuple(
v
for triple in zip(tuple_a[::2], tuple_a[1::2], tuple_b)
for v in triple
)
print(tuple_c)
Другой вариант — использовать индекс и сопоставить его с соответствующим поиском:
tuple_c = tuple(
v
for i in range(len(tuple_b))
for v in (tuple_a[i*2], tuple_a[i*2+1], tuple_b[i])
)
Вы также можете использовать itertools.chain
, чтобы избежать понимания:
from itertools import chain
tuple_a = (1, 3, 5, 7, 9, 11, 13, 15)
tuple_b = (2, 4, 6, 8)
tuple_c = tuple(chain(*zip(tuple_a[::2], tuple_a[1::2], tuple_b)))
print(tuple_c)
Для новичка я бы рекомендовал сделать простой цикл for по «диапазону (0, len (tuple_b))» и собрать нужные элементы с небольшим количеством индексной арифметики из кортежей.