我需要使用给定的比率[0.55, 0.45]
细分给定数量的项目(比方说10)。结果应该是6:4或5:5。通常的方法[0.55*10, 0.45*10]
会导致[6, 5]
(11,而不是10)。
另一个例子:使用比率除以7:[0.36, 0.44, 0.07, 0.07, 0.03, 0.03]
理想情况下应该产生类似[3, 3, 1, 0, 0, 0]
或[3, 3, 0, 1, 0, 0]
的内容。
这个问题的好方法是什么?
答案 0 :(得分:2)
我建议你有另一个阵列。我是Python的初学者。
以下是您的示例代码(您可以简单地调整它,我确定):
a = [0.36, 0.44, 0.07, 0.07, 0.03, 0.03]
numberItem = 7
remainder = numberItem
b = [0,0,0,0,0,0]
for i in range(0,6):
b[i] = round(a[i]*numberItem)
if (b[i] > remainder) or (b[i] == 0):
b[i] = remainder
remainder = 0
else:
remainder = remainder - b[i]
print(b[i])
有了这个界限,你不能拥有超过规定的项目。 如果比率数组从大到小排序,那就更好了。
答案 1 :(得分:1)
这是我对此事的尝试:)最难的部分是逆转排序操作并将其与结果匹配......如果您不需要保持比率的原始顺序,那么您可以删除最后一个功能的一部分
def scale_ratio(ratios: list) -> list:
sum_ = sum(ratios)
return [x/sum_ for x in ratios]
def ratio_breakdown_recursive(x: int, ratios: list) -> list:
top_ratio = ratios[0]
part = round(x*top_ratio)
if x <= part:
return [x]
x -= part
return [part] + ratio_breakdown_recursive(x, scale_ratio(ratios[1:]))
def ratio_breakdown(x: int, ratios: list) -> list:
sorted_ratio = sorted(ratios, reverse=True)
assert(round(sum(ratios)) == 1)
sorted_result = ratio_breakdown_recursive(x, sorted_ratio)
assert(sum(sorted_result) == x)
# Now, we have to reverse the sorting and add missing zeros
sorted_result += [0]*(len(ratios)-len(sorted_result))
numbered_ratios = [(r, i) for i, r in enumerate(ratios)]
sorted_numbered_ratios = sorted(numbered_ratios, reverse=True)
combined = zip(sorted_numbered_ratios, sorted_result)
combined_unsorted = sorted(combined, key=lambda x: x[0][1])
unsorted_results = [x[1] for x in combined_unsorted]
return unsorted_results
结果:
ratio_breakdown(7, [0.36, 0.44, 0.07, 0.07, 0.03, 0.03])
[3, 3, 1, 0, 0, 0]
ratio_breakdown(10, [0.55, 0.45])
[6, 4]
ratio_breakdown(16, [0.16, 0.47, 0.13, 0.24])
[2, 8, 2, 4]
编辑:那是Python3。