2017-07-15 47 views
-3

我具有範圍N元件的總數目和若干塊nb的最佳方式範圍分成n個相等的範圍在Python

我要劃分Nnb最佳可能等於範圍,只用起始號碼和結束號碼。因此,例如,N=24nb=5應該輸出:

0,5 5,10 10,15 15,20 20,24 

雖然N=28nb=5應該輸出:

0,5 5,10 10,16 16,22 22,28 (the rest of `N/nb` division is equally distributed on the 3 last subranges) 

基於一個評論,我有這樣的方法:

def partition(lst, n): 
    division = len(lst)/n 
    return [lst[round(division * i):round(division * (i + 1))] for i in range(n)] 

def ranges(N, nb): 
    return ["{},{}".format(r.start, r.stop) for r in partition(range(N), nb)] 

>>> ranges(28, 5) 
['0,6', '6,11', '11,17', '17,22', '22,28'] 

有一個更好的方法來做到這一點?

+1

這有點類似於這個問題:https://stackoverflow.com/q/2659900/270986 –

回答

0

這無疑是簡單直接計算的起始和終止數字,而不是切片一個range對象,讓他們:

def ranges(N, nb): 
    step = N/nb 
    return ["{},{}".format(round(step*i), round(step*(i+1))) for i in range(nb)] 

這不是比你的代碼更高效,它可能看起來是因爲切一range對象只需要O(1)時間,所以您現有的代碼已經漸近最優。我的版本可能會提高性能的一些常數,但它可能很小。我認爲我的版本也更清晰,這可能比可能出現的性能變化更重要。