Python - 将列表中的数字均分

Python - Evenly divide numbers in a list of lists

如何才能有效地将数字均匀分布在 'n' 个组中?

我想到了这个函数,但是它并没有把这个数字完全平分。

def DivideList(total_num, div_num):

    div = int(total_num)/int(div_num)

    if (div_num < total_num):
        div_list = [[div*i, div*(i+1)] for i in range(div_num)]
        div_list[div_num-1][1] = total_num
    else:
        div_list = [[i, i+1] for i in range(total_num)]

    return div_list

print DivideList(100, 8)

这也可以通过列表理解来实现吗?

编辑:

示例:

DivideList(20, 4) >> [[0, 5], [5, 10], [10, 15], [15, 20]]

DivideList(14, 4) >> [[0, 4], [4, 8], [8, 11], [11, 14]]

这是实现结果的一种可能性。如果这还不够,请指定您希望处理的极端情况。例如,如果预期参数已经是 int,则转换为 int 没有意义,如您的示例所示。

正如 ma3oun 所建议的,np.linspace 是实现这一目标的绝佳方式:

>>> def divide_list(total_num, div_num):
...     temp = np.linspace(0, total_num, div_num + 1)
...     return list(zip(temp[:-1], temp[1:]))
...
>>> divide_list(100, 8)
[(0.0, 12.5), (12.5, 25.0), (25.0, 37.5), (37.5, 50.0), (50.0, 62.5), (62.5, 75.0), (75.0, 87.5), (87.5, 100.0)]

与上一个示例不同,这会产生偶数步:

>>> divide_list(20, 4)
[(0.0, 5.0), (5.0, 10.0), (10.0, 15.0), (15.0, 20.0)]
>>> divide_list(14, 4)
[(0.0, 3.5), (3.5, 7.0), (7.0, 10.5), (10.5, 14.0)]

我之前使用 np.arange 的示例:

>>> import numpy as np
>>> def divide_list(total_num, div_num):
...     div = total_num / div_num
...     temp = np.arange(0, total_num + div, div)
...     return list(zip(temp[:-1], temp[1:]))
...
>>> divide_list(100, 8)
[(0.0, 12.5), (12.5, 25.0), (25.0, 37.5), (37.5, 50.0), (50.0, 62.5), (62.5, 75.0), (75.0, 87.5), (87.5, 100.0)]

旧建议:

So if you are simply trying to force a float division, change your code as

div = 1.0*total_num/div_num

编辑:所以我仍然不清楚你的要求,但我的尝试如下。另外,它必须是列表理解吗?在这种情况下确实会影响可读性。我设法在两个列表理解中实现了它。

def Segments(total_num,div_num):
    return [(total_num/div_num)+1 if(i<total_num%div_num) else (total_num/div_num) for i in range(div_num)]

def DivideList(series):
    return [[sum(series[0:i]),sum(series[0:i+1])] for i in range(len(series))]

print DivideList(Segments(100,8))

也许有人可以 shorten/beautify 更进一步。

示例 1:

def DivideList(total_num, div_num):
    div = total_num / div_num
    left = total_num - div * div_num
    result = []
    m = 0
    for i in xrange(left):
        k = m
        m += (div + 1)
        result.append([k, m])

    for i in xrange(div_num - left):
        k = m
        m += div
        result.append([k, m])

    return result

更简洁:

def DivideList(total_num, div_num):
    div = total_num / div_num
    left = total_num - div * div_num
    result = []
    for i in xrange(0, left*(div+1), div+1):
        result.append([i, i+div+1])

    for i in xrange(left*(div+1), total_num, div):
        result.append([i, i+div])

    return result

示例 2: 这是一个生成你想要的块的生成器:

def DivideList(total_num, div_num):
    div = total_num / div_num
    left = total_num - div * div_num
    m = 0
    for i in xrange(left):
        k = m
        m += (div + 1)
        yield [k, m]

    for i in xrange(div_num - left):
        k = m
        m += div
        yield [k, m]

更简洁:

def DivideList(total_num, div_num):
    div = total_num / div_num
    left = total_num - div * div_num
    for i in xrange(0, left*(div+1), div+1):
        yield [i, i+div+1]

    for i in xrange(left*(div+1), total_num, div):
        yield [i, i+div]