Как продублировать конкретное значение в списке / массиве?

Любые советы о том, как повторить определенное значение в массиве в 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 и смог продублировать весь массив, но не определенное значение.

Я рекомендую вам выбрать учебник по работе со списком, который соответствует вашему текущему уровню обучения. Есть способы сделать это много, но то, как вы задаете вопросы, предполагает, что вы выиграете от более широкого представления темы. Обучение на уровне учебных пособий выходит за рамки возможностей Stack Overflow.

Prune 14.09.2018 02:05

Добавлен тег numpy, поскольку OP использовал numpy для попытки решения.

cs95 14.09.2018 02:41
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
7
2
616
9

Ответы 9

  1. цикл по массиву ('список' в python)

  2. найди номер

  3. получить позицию совпадающего числа в массиве

  4. вставьте еще один номер после каждой совпадающей позиции

https://docs.python.org/3/reference/compound_stmts.html#for

https://docs.python.org/2/tutorial/datastructures.html#more-on-lists

не переопределит ли это число после совпадающей позиции? я должен увеличить размер массива, затем сдвинуть, а затем добавить элемент?

As tudent 14.09.2018 02:03

Если вы конвертируете его в список, вы можете просмотреть его в цикле и, если он соответствует вашим критериям, добавить дополнительную версию. Например:

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 нет необходимости.

Denziloe 14.09.2018 02:19

Может быть, вы можете использовать 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.

Denziloe 14.09.2018 02:28

Это кажется хорошим вариантом использования генератор:

>>> 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
]

По сути, он выдает кортежи, «повторы», которые содержат элемент один раз, если это не повторяемый элемент, или два раза, если это элемент, который нужно повторить. Затем все элементы этих «повторяющихся» кортежей сглаживаются в ответ.

Причудливый отрицательный ответ, это то же самое, что и ответ, за который проголосовали положительно.

Denziloe 14.09.2018 11:12

Вот удобный однострочник с использованием 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])

удивительный! как обычно

Khalil Al Hooti 14.09.2018 04:09

Можно попробовать составить список и создать функцию 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]

Другие вопросы по теме