使用给定比率细分整数而不产生浮点数

时间:2015-12-08 12:51:02

标签: python list math

我需要使用给定的比率[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]的内容。

这个问题的好方法是什么?

2 个答案:

答案 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。