2011-08-25 86 views
4

所以每個人都知道我能得到號碼列表與range像這樣:python範圍()與重複?

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

如果我想,說,每個數字的3份,我可以使用:

>>> 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(range(5)*3)具有不必要的n * log(n)複雜性,並且[x//3 for x in range(3*5)]有效,但似乎是對//操作的濫用。

+2

即使你說你不想要它,排序(範圍(5)* 3)對我來說看起來很優雅:)) – Habbie

回答

11

你可以這樣做:

>>> [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)部分應該與你重複的次數來代替......

BTW,您應該使用發電機


只是使它更清楚的是,_是一個你不關心的東西的變量名(任何名字都是允許的)。

這個列表解析使用嵌套for循環和就像是:

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

我喜歡它!如果你能解釋這個神祕的列表技巧是如何工作的,我會接受這個答案。我在交互式python中使用了'_'來引用前面的輸出,它是否與此有關? – wim

+1

在代碼中使用'_'來表示你不關心變量的含義。我只想循環3次,但不關心索引...這是一個約定,認爲 – JBernardo

+3

我說的發電機是:'(我爲xrange(5)爲我在xrange(3)j)' – JBernardo

7

試試這個:

itertools.chain.from_iterable(itertools.repeat(x, 3) for x in range(5)) 
-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] 
+2

你嚇壞了嗎?我笑了 – 2011-08-25 05:45:25

-2

我喜歡保持它很簡單:)

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

哦,有人已經提到過... – pawroman

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