Вот удобная однострочная строка, использующая itertools
и список для понимания с if и else в нем. Сначала он создает вложенный список (чтобы иметь возможность повторять элементы в определенной позиции), а затем просто сгладит его в конце, используя .chain()
-method:
from itertools import chain
array_a = [1, 2, 1, 2, 1, 1, 2]
list(chain.from_iterable([[item, item] if item == 2 else [item] for item in array_a]))
[1, 2, 2, 1, 2, 2, 1, 1, 2, 2] # output
Конкретное значение double находится внутри оператора if. Использование множителей (вместо [item, item]
) и переменной (вместо 2
) сделало бы это более общим, см. Например:
from itertools import chain
def repeat_certain_value(array, val, n):
return list(chain.from_iterable(([i] * n if i == val else [i] for i in array)))
repeat_certain_value([1, 2, 1, 2, 1, 1, 2], 2, 2)
[1, 2, 2, 1, 2, 2, 1, 1, 2, 2] # output
repeat_certain_value([0, -3, 1], -3, 5)
[0, -3, -3, -3, -3, -3, 1] # output
Несмотря на то, что этот подход представляет собой удобный однострочник с использованием встроенных библиотек, подход из coldspeed быстрее:
%timeit for x in range(1000): repeat_certain_value([1, 1, 1, 2, 2, 2, 3, 3, 3] * 100, 2, 2)
10 loops, best of 3: 165 ms per loop
%timeit for x in range(1000): coldspeeds_solution([1, 1, 1, 2, 2, 2, 3, 3, 3] * 100, 2, 2)
10 loops, best of 3: 100 ms per loop