带重复的python range()?
大家都知道,可以用 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