Как продублировать конкретное значение в списке / массиве? - PullRequest
0 голосов
/ 14 сентября 2018

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

Ответы [ 9 ]

0 голосов
/ 14 сентября 2018

Если вы заинтересованы в простом решении, вы можете повторить массив для себя, используя 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])
0 голосов
/ 14 сентября 2018

Можно попробовать понять список и создать функцию 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]
0 голосов
/ 14 сентября 2018

Вот удобная однострочная строка, использующая 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
0 голосов
/ 14 сентября 2018

Использование генератора.

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))
0 голосов
/ 14 сентября 2018

Попытка использовать понимание.

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
]

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

0 голосов
/ 14 сентября 2018

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

>>> 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]
0 голосов
/ 14 сентября 2018

Может быть, вы можете использовать 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]
0 голосов
/ 14 сентября 2018

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

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)
0 голосов
/ 14 сентября 2018
  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

...