Повторение элементов списка n раз
Как я повторяю каждый элемент списка n
раз и формирую новый список? Например:
x=[1,2,3,4]
n=3
x1=[1,1,1,2,2,2,3,3,3,4,4,4]
x*n
не работает
for i in x[i]
x1=n*x[i]
Должен быть простой и умный способ.
Ответы
Ответ 1
Если вы действительно хотите получить результат в виде списка, а генератора недостаточно:
import itertools
lst = range(1,5)
list(itertools.chain.from_iterable(itertools.repeat(x, 3) for x in lst))
Out[8]: [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]
Ответ 2
Идеальный способ, вероятно, numpy.repeat
:
In [16]:
x1=[1,2,3,4]
In [17]:
np.repeat(x1,3)
Out[17]:
array([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4])
Ответ 3
Вы можете использовать понимание списка:
[item for item in x for i in range(n)]
>>> x=[1, 2, 3, 4]
>>> n = 3
>>> new = [item for item in x for i in range(n)]
>>> new
[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]
>>>
Ответ 4
Вложенный список-comp работает здесь:
>>> [i for i in range(10) for _ in xrange(3)]
[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9]
Или использовать свой пример:
>>> x = [1, 2, 3, 4]
>>> n = 3
>>> [i for i in x for _ in xrange(n)]
[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]
Ответ 5
Более простой способ добиться этого - умножить список x
на n
и отсортировать полученный список. например
>>> x = [1,2,3,4]
>>> n = 3
>>> a = sorted(x*n)
>>> a
>>> [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]
Ответ 6
import itertools
def expand(lst, n):
lst = [[i]*n for i in lst]
lst = list(itertools.chain.from_iterable(lst))
return lst
x=[1,2,3,4]
n=3
x1 = expand(x,3)
print(x1)
дает:
[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]
Пояснение:
Выполнение [3]*3
дает результат [3,3,3]
, заменяя это на n
, мы получаем [3,3,3,...3] (n times)
Используя понимание списка, мы можем пройти через каждый элемент списка и выполнить эту операцию, наконец, нам нужно сгладить список, который мы можем сделать с помощью list(itertools.chain.from_iterable(lst))
Ответ 7
Если вы хотите изменить список на месте, лучшим способом является повторение со спины и назначение фрагмента того, что было ранее одним элементом, в список этого элемента n
times.
Это работает из-за назначения среза:
>>> ls = [1, 2, 3]
>>> ls[0: 0+1]
[1]
>>> ls[0: 0+1] = [4, 5, 6]
>>> ls
>>> [4, 5, 6, 2, 3]
def repeat_elements(ls, times):
for i in range(len(ls) - 1, -1, -1):
ls[i: i+1] = [ls[i]] * times
Использование демо:
>>> a = [1, 2, 3]
>>> b = a
>>> b
[1, 2, 3]
>>> repeat_elements(b, 3)
>>> b
[1, 1, 1, 2, 2, 2, 3, 3, 3]
>>> a
[1, 1, 1, 2, 2, 2, 3, 3, 3]
(Если вы не хотите изменять его на месте, вы можете скопировать список и вернуть копию, которая не будет изменять оригинал. Это также будет работать для других последовательностей, таких как tuple
s, но не ленив, как метод itertools.chain.from_iterable
и itertools.repeat
)
def repeat_elements(ls, times):
ls = list(ls) # Makes a copy
for i in range(len(ls) - 1, -1, -1):
ls[i: i+1] = [ls[i]] * times
return ls
Ответ 8
zAxe=[]
for i in range(5):
zAxe0 =[i] * 3
zAxe +=(zAxe0) # append allows accimulation of data