Python中range()函数是否允许重复值?

10

众所周知,可以用 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

2
尽管你说你不想要,但对我来说sorted(range(5)*3)看起来相当优雅 ;) - Habbie
8个回答

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

1
在编程中,下划线_用于表示您不关心变量将持有什么值。我只想循环三次但不关心索引... 这是一种约定俗成的方式。 - JBernardo
3
我在谈论的生成器是:(i for i in xrange(5) for j in xrange(3)) - JBernardo
好的,那就用你最喜欢的名字吧!在我提供的生成器上,它不会泄露变量。 :) - JBernardo

8

试试这个:

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

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

2

有一个非常简单的方法可以借助于 numpy 来实现。示例:

>>> import numpy as np
>>> np.arange(5*3) // 3
array([0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4])

使用range您可以执行以下操作:

>>> list(map(lambda x: x // 3, range(5*3)))
[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]

请记住//执行的是严格整数除法。


1
>>> from itertools import chain, izip, tee
>>> list(chain.from_iterable(izip(*tee(range(5), 3))))
[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]

1
一个使用另一种方法的很酷的迭代器:
>>> from collections import Counter
>>> Counter(range(5) * 3).elements()

-1

我喜欢保持简单 :)

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

-2
import itertools
[x for tupl in itertools.izip(*itertools.tee(range(0,5),3)) for x in tupl]

或者:

[x for tupl in zip(range(0,5), range(0,5), range(0,5)) for x in tupl]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接