2016-08-08 79 views

回答

4

另一個想法,而不需要任何其他軟件包或款項:

[x//N for x in range((M+1)*N)] 

其中N是您重複的次數,M是重複的最大值。例如。

N = 3 
M = 5 
[x//N for x in range((M+1)*N)] 

產生

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

我的第一反應是讓從funcy包一些功能性的幫助。如果N是重複每個值的次數,並M是重複的最大值,那麼你可以做

import funcy as fp 

fp.flatten(fp.repeat(i, N) for i in range(M + 1)) 

這將返回一個發電機,所以讓你可以叫list()周圍的陣列

+0

這將在python 3中返回生成器,但在python 2中返回列表。要在python 2中獲取迭代器使用'iflatten()'。 – Suor

0

sum([[i]*n for i in range(0,x)], [])

+1

'sum'對於數組來說**非常慢。 – Arnial

0

下面這段代碼是我能想到的最簡單的版本。 這有點髒,很長,但它完成了工作。

在我看來,它更容易理解。

def mklist(s, n): 
    l = [] # An empty list that will contain the list of elements 
      # and their duplicates. 

    for i in range(s):  # We iterate from 0 to s 
     for j in range(n): # and appending each element (i) to l n times. 
      l.append(i) 

    return l # Finally we return the list. 

如果運行代碼...:

print mklist(10, 2) 

[0,0,1,1,2,2,3,3,4,4,5,5,6,6, 7,7,8,8,9,9]

print mklist(5, 3) 

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

另一個版本有點整潔,有列表理解。 但是嗯...我們必須對其進行排序。

def mklist2(s, n):    
    return sorted([l for l in range(s) * n]) 

運行該版本將給出以下結果。

print mklist2(5, 3) 

原材料:[0,1,2,3,4,0,1,2,3,4,0,1,2,3,4]

排序:[0,0 ,0,1,1,1,2,2,3,3,3,4,4,4]