Подтвердить что ты не робот

Список чередования с фиксированным элементом

Я знаю, что я могу чередовать два списка python с помощью:

[elem for pair in zip(*lists) for elem in pair]

Теперь мне нужно чередовать список с фиксированным элементом вроде:

list = [1, 2, 3, 4]
# 🐍 python magic 🐍
output = [1, 0, 2, 0, 3, 0, 4]
4b9b3361

Ответ 1

Одно действительно простое решение:

[elem for x in list for elem in (x, 0)][:-1]

Ответ 2

Вы можете попробовать следующую магию itertools:

>>> from itertools import repeat, chain, izip
>>> l = [1, 2, 3, 4]
>>> list(chain.from_iterable(izip(l[:-1], repeat(0)))) + l[-1:]
[1, 0, 2, 0, 3, 0, 4]

Ответ 3

from itertools import izip, repeat

start = [1, 2, 3, 4]

print [i for j in izip(start, repeat(0)) for i in j][:-1]

Ответ 4

Функция Python sum может использоваться для произвольных типов данных, которые поддерживают добавление, устанавливая параметр start соответствующим образом. (см. документы)

input = [1, 2, 3, 4]
fixed = 0
output = sum([[elem, fixed] for elem in input], [])[:-1]  # to drop the last `fixed`

Или, если вам не нравится идея использования оператора добавления со списками:

input = [1, 2, 3, 4]
fixed = 0
output = []
for elem in input:
    output.extend([elem, fixed])
output = output[:-1]

Ответ 5

>>> lst = [1, 2, 3, 4]
>>> newlst = [0]*((len(lst) * 2) - 1)
>>> newlst[::2] = lst
>>> newlst
[1, 0, 2, 0, 3, 0, 4]

Это может быть не однострочный, но он работает. Кроме того, мои тесты времени, похоже, показывают, что это самое быстрое решение. В форме функции это:

def interzero(lst):
    newlst = [0]*((len(lst) * 2) - 1)
    newlst[::2] = lst
    return newlst

Ответ 6

Вы можете использовать функцию reduce functools.

>>> from functools import reduce
>>> reduce(lambda x, y: x + [y, 0], [1,2,3,4], [])[:-1]
[1, 0, 2, 0, 3, 0, 4]

Ответ 7

>>> from itertools import chain

>>> lst = [1, 2, 3, 4]
>>> list(chain(*zip(lst, [0]*(len(lst)-1)))) + [lst[-1]]
[1, 0, 2, 0, 3, 0, 4]