2016-08-08 43 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]