Я знаю, что я могу чередовать два списка 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]
Я знаю, что я могу чередовать два списка 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]
Одно действительно простое решение:
[elem for x in list for elem in (x, 0)][:-1]
Вы можете попробовать следующую магию 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]
from itertools import izip, repeat
start = [1, 2, 3, 4]
print [i for j in izip(start, repeat(0)) for i in j][:-1]
Функция 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]
>>> 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
Вы можете использовать функцию 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]
>>> 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]