重复列表的元素n次

use*_*101 39 python

如何重复列表的每个元素n次数并形成新列表?例如:

x=[1,2,3,4]
n=3

x1=[1,1,1,2,2,2,3,3,3,4,4,4]
Run Code Online (Sandbox Code Playgroud)

x*n 不起作用

for i in x[i]
    x1=n*x[i]
Run Code Online (Sandbox Code Playgroud)

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

CT *_*Zhu 76

理想的方式可能是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])
Run Code Online (Sandbox Code Playgroud)

  • 对于菜鸟来说,你需要在文件的头部“import numpy as np”;-) (3认同)

m.w*_*ski 30

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

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]
Run Code Online (Sandbox Code Playgroud)

  • 对于那些对效率感兴趣的人,这是本文中列出的(如果不是**最快的方法**)之一。 (2认同)

A.J*_*pal 25

您可以使用列表理解:

[item for item in x for i in range(n)]
Run Code Online (Sandbox Code Playgroud)

这运行如下:

>>> 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]
>>> 
Run Code Online (Sandbox Code Playgroud)

这与更详细的嵌套__CODE__循环相同:

[item for item in x for i in range(n)]
Run Code Online (Sandbox Code Playgroud)

或者,使用,如您在代码中所要求的那样:

>>> 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]
>>> 
Run Code Online (Sandbox Code Playgroud)
[item for item in x for i in range(n)]
Run Code Online (Sandbox Code Playgroud)


Soh*_*oqi 15

实现此目的的一种更简单的方法是将列表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]
Run Code Online (Sandbox Code Playgroud)

  • 如果要保留顺序`x = list('NESW')`则不起作用。 (4认同)

mgi*_*son 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]
Run Code Online (Sandbox Code Playgroud)

或者使用您的示例:

>>> 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]
Run Code Online (Sandbox Code Playgroud)