在Python中将范围分成n个相等范围的最佳方法

时间:2017-07-15 21:21:42

标签: python range divide

我有nb范围内的元素总数和多个块N

我想将nb划分为N=24最佳可能的相等范围,只包括起始编号和结束编号。例如,nb=50,5 5,10 10,15 15,20 20,24 应输出:

N=28

nb=50,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']

根据一条评论,我有这个方法:

OnCheckedChangeListener()

有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

直接计算起始和停止数字肯定更简单,而不是切片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)时间,因此它的效率不如它可能看起来那么高,因此现有代码已经渐近最优。我的版本可能会通过一些常数因素来提高性能,但它可能很小。我认为我的版本也更加清晰,这可能比可能出现的性能变化更重要。