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]
如何才能有效地将数字均匀分布在 '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]