带重复的python range()?

10 投票
8 回答
11483 浏览
提问于 2025-04-17 00:18

大家都知道,可以用 range 来生成一串数字,像这样:

>>> list(range(5))
[0, 1, 2, 3, 4]

如果你想要每个数字出现3次,可以这样做:

>>> list(range(5)) * 3
[0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4]

但是有没有更简单的方法,使用 range 来重复这些数字呢?

[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]

举个例子:

sorted(list(range(5)) * 3)   # has unnecessary n * log(n) complexity
[x//3 for x in range(3*5)]   # O(n), but division seems unnecessarily complicated

8 个回答

4
from itertools import chain, izip
list(chain(*izip(*[xrange(5)]*3)))

给出

[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]

去掉列表,你就得到了一个生成器。

编辑:或者更好(省略了对izip的函数调用):

list(chain(*([x]*3 for x in xrange(5))))
8

试试这个:

itertools.chain.from_iterable(itertools.repeat(x, 3) for x in range(5))
22

你可以这样做:

>>> [i for i in range(5) for _ in range(3)]
[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]

这里的 range(3) 部分应该替换成你想要的重复次数...

顺便说一下,你应该使用生成器。


为了更清楚, _ 是一个变量名,用来表示你不关心的东西(你可以用任何名字)。

这个列表推导式使用了嵌套的 for 循环,和下面这样类似:

for i in range(5):
    for j in range(3):
        #your code here

撰写回答