Если вам разрешено использовать itertools
, то вы можете сделать:
import itertools
decider = [1,1,1,1,1,0,0,0,1,1,1,0,0,0,0]
temp = [150 if i==1 else -150 for i in decider]
runs = [list(i[1]) for i in itertools.groupby(temp)]
print(runs) # [[150, 150, 150, 150, 150], [-150, -150, -150], [150, 150, 150], [-150, -150, -150, -150]]
runs = [i[:4]+[0]*(len(i)-4) for i in runs]
print(runs) # [[150, 150, 150, 150, 0], [-150, -150, -150], [150, 150, 150], [-150, -150, -150, -150]]
result = list(itertools.chain(*runs))
print(result) # [150, 150, 150, 150, 0, -150, -150, -150, 150, 150, 150, -150, -150, -150, -150]
Объяснение: сначала я меняю 1
на 150
, а все остальное на -150
, а затем нахожу последовательные прогоны 150 и -150 (обратите внимание, что itertools.groupby
работает таким образом, а не SQL GROUP BY
), затем я для каждого подсписка получаю 4 первых элемента и объединяю его с (исходная длина - 4) нулями. Обратите внимание, что в Python разрешено умножать list
на отрицательное число (в результате получается пустой list
), поэтому мне не нужно реализовывать особый случай для коротких списков. Наконец я сглаживаю - превращаю list
из list
с в плоские list
.