我的情况是,我的发票电子表格会传入一行,其中包含一个数量列,其中包含跨越所有月份数量总和的数量。
为了运行逐月分析,我们需要将总数量分成n行中的相等(ish)数量,其中n是跨越的月数。
这些数字可以减去一两个,但每个元素之间的差异越小越好。
我有一个粗略的模型我在python中做过,但我觉得有更好的方法以某种方式做到这一点。注意:请原谅......一切:
from __future__ import division
import math
def evenDivide(num, div):
splits = []
sNum = str(num/div)
remainder = float(sNum[sNum.index('.'):])
#print "Remainder is " + str(remainder)
integer = math.floor(num/div)
#print "Integer is " + str(integer)
totRemainder = round(remainder * div, 2)
#print "Total Remainder is " + str(totRemainder)
for index in range(div):
if (totRemainder > 0):
totRemainder -= 1 if (index%2 == 0) else 0
if (index % 2 == 0):
splits.append(int(integer + 1))
else:
splits.append(int(integer))
else:
splits.append(int(integer))
for index in range(div):
if(totRemainder > 0):
if (index % 2 == 1):
splits[index] += 1
totRemainder -= 1
return splits
def EvalSolution(splits):
total = 0
for index in range(len(splits)):
total += splits[index]
return total
def testEvenDivide():
for index in range(20000):
for jndex in range(3, 200):
if (EvalSolution(evenDivide(index, jndex)) != index):
print "Error for " + str(index) + ", " + str(jndex)
答案 0 :(得分:4)
我假设num和div都是整数(你应该在你的问题中提到它)。
您可以使用模运算符查找除法的其余部分:
remainder=num%div # i.e. 124/12 will give you 4
整数除法将为您提供结果的整数部分,而不使用math.floor
integer = num/div # i.e. 124/12 will give you 10
我现在会返回(整数,余数)元组,但是如果你真的需要列表中的所有拆分,你可以这样做:
splits=[]
for i in range(div):
splits.append(integer)
for i in range(remainder):
splits[i]+=1
答案 1 :(得分:1)
如果空间不足,这种单线可能会有所帮助:
num, div = 15, 4
print ([num // div + (1 if x < num % div else 0) for x in range (div)])
# result: [4, 4, 4, 3]
答案 2 :(得分:1)
这个衬垫可以帮助:
def get_evenly_divided_values(value_to_be_distributed, times):
return [value_to_be_distributed // times + int(x < value_to_be_distributed % times) for x in range(times)]