将列表元素重复 n 次

118 投票
14 回答
174257 浏览
提问于 2025-04-18 09:48

我想知道怎么把一个列表里的每个元素重复 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]

应该有一种简单又聪明的方法。

14 个回答

10

这里可以使用嵌套的列表推导:

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

有一个更简单的方法来实现这个功能,就是把列表 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]
67

你可以使用列表推导式:

[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)]
#[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]
159

最理想的方法可能是 numpy.repeat

In [16]:

import numpy as np  
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])
69

如果你真的想要结果是一个列表,而生成器不够用的话:

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]

撰写回答