Любые советы о том, как повторить определенное значение в массиве в Python?
Например, я хочу повторить только 2 в array_a:
array_a = [1, 2, 1, 2, 1, 1, 2]
Желаемый результат: я повторяю каждый 2 и оставляю 1:
array_a = [1, 2, 2, 1, 2, 2, 1, 1, 2, 2] # only the `2` should be repeated
Я попробовал numpy и смог продублировать весь массив, но не определенное значение.
Добавлен тег numpy, поскольку OP использовал numpy для попытки решения.






цикл по массиву ('список' в python)
найди номер
получить позицию совпадающего числа в массиве
вставьте еще один номер после каждой совпадающей позиции
https://docs.python.org/3/reference/compound_stmts.html#for
https://docs.python.org/2/tutorial/datastructures.html#more-on-lists
не переопределит ли это число после совпадающей позиции? я должен увеличить размер массива, затем сдвинуть, а затем добавить элемент?
Если вы конвертируете его в список, вы можете просмотреть его в цикле и, если он соответствует вашим критериям, добавить дополнительную версию. Например:
a = [1,2,1,2,1,1,2]
long_a = []
for x in a:
long_a.append(x)
if x == 2:
long_a.append(x)
Хорошее решение - звонить на list нет необходимости.
Может быть, вы можете использовать dictionary для каждого уникального элемента и количество раз, когда он должен быть повторен. Затем с помощью list comprehension для создания массива:
array_a = [1,2,1,2,1,1,2]
repeat_times = {1:1, 2:2} # 1 is 1 time and 2 is repeated two times
result = [i for i in array_a for j in range(repeat_times[i])]
print(result)
Выход:
[1, 2, 2, 1, 2, 2, 1, 1, 2, 2]
Хороший подход. Совет по стилю: используйте _ для фиктивных переменных, таких как j.
Это кажется хорошим вариантом использования генератор:
>>> def repeater(iterable, repeat_map):
... for value in iterable:
... for i in range(repeat_map.get(value, 1)):
... yield value
...
>>> array_a = [1,2,1,2,1,1,2]
>>> list(repeater(array_a, repeat_map = {2: 2}))
[1, 2, 2, 1, 2, 2, 1, 1, 2, 2]
Попытка использования понимания.
array = [1, 2, 1, 2, 1, 1, 2]
element_to_repeat = 2
result = [
repeats_element
for repeats in
((element,)*2 if element == element_to_repeat else (element,) for element in array)
for repeats_element in repeats
]
По сути, он выдает кортежи, «повторы», которые содержат элемент один раз, если это не повторяемый элемент, или два раза, если это элемент, который нужно повторить. Затем все элементы этих «повторяющихся» кортежей сглаживаются в ответ.
Причудливый отрицательный ответ, это то же самое, что и ответ, за который проголосовали положительно.
Вот удобный однострочник с использованием itertools и понимания списка с if и else в нем. Сначала он создает вложенный список (чтобы иметь возможность повторять элементы в определенной позиции), а затем просто сглаживает его в конце, используя метод .chain():
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
Конкретное значение для удвоения находится внутри оператора 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
Хотя этот подход является удобным однострочным с использованием встроенных библиотек, подход из холодная скорость работает быстрее:
%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
Используя генератор.
array = [1, 2, 1, 2, 1, 1, 2]
element_to_repeat = 2
def add_repeats(array, element_to_repeat):
for element in array:
if element == element_to_repeat:
yield element
yield element
else:
yield element
result = list(add_repeats(array, element_to_repeat))
Если вас интересует простое решение, вы можете повторить массив на самом себе, используя np.repeat.
>>> import numpy as np
>>> np.repeat(array_a, array_a)
array([1, 2, 2, 1, 2, 2, 1, 1, 2, 2])
Это работает, только если в ваших данных есть 1 и 2. Для общего решения рассмотрим
>>> n_repeats = 2
>>> temp = np.where(np.array(array_a) == 2, n_repeats, 1)
>>> np.repeat(array_a, temp)
array([1, 2, 2, 1, 2, 2, 1, 1, 2, 2])
удивительный! как обычно
Можно попробовать составить список и создать функцию flat:
array_a = [1, 2, 1, 2, 1, 1, 2]
def flat(l):
newl=[]
for i in l:
if isinstance(i,list):
newl.extend(i)
else:
newl.append(i)
return newl
print(flat([[i]*2 if i==2 else i for i in array_a]))
Выход:
[1, 2, 2, 1, 2, 2, 1, 1, 2, 2]
Я рекомендую вам выбрать учебник по работе со списком, который соответствует вашему текущему уровню обучения. Есть способы сделать это много, но то, как вы задаете вопросы, предполагает, что вы выиграете от более широкого представления темы. Обучение на уровне учебных пособий выходит за рамки возможностей Stack Overflow.