重复列表的元素n次

问题描述 投票:35回答:8

如何重复列表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]

必须有一个简单而聪明的方式。

python
8个回答
27
投票

如果你真的想要结果作为列表,并且生成器是不够的:

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]

71
投票

理想的方式可能是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])

24
投票

您可以使用列表理解:

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

6
投票

嵌套的list-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]

1
投票
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))


1
投票

实现此目的的一种更简单的方法是将列表xn相乘并对结果列表进行排序。例如

>>> x = [1,2,3,4]
>>> n = 3
>>> a = sorted(x*n)
>>> a
>>> [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]

0
投票

如果要在适当位置修改列表,最好的方法是从后面进行迭代,并将之前一个项目的切片分配给该项目的列表n次。

这是因为切片分配:

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

(如果你不想在原地修改它,你可以复制列表并返回副本,这不会修改原文。这也适用于其他序列,如tuples,但不像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

0
投票
zAxe=[]
for i in range(5):
    zAxe0 =[i] * 3
    zAxe +=(zAxe0) # append allows accimulation of data 

推荐问答