gpt4 book ai didi

python - 使用给定比率分割整数而不产生 float

转载 作者:行者123 更新时间:2023-11-30 23:03:20 24 4
gpt4 key购买 nike

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

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

最佳答案

这是我对此事的尝试:)最难的部分是反转排序操作并将其与结果匹配...如果您不需要保留比率的原始顺序,那么您可以删除最后一个函数的一部分.

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。

关于python - 使用给定比率分割整数而不产生 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34156371/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com