重新分配具有上限的 int 列表

Redistribution of int list with upper limit

我有几个数字像乐谱的一部分:

my_list = [10, 5, 20, 30, 25, 10]

我的积分总和是 100 - 这是 最大值

我想对其进行归一化,知道总和不应超过 100。我该怎么做? 因此,如果我添加另一个得分为 10 的元素,将从其余元素中减去一个数字,以便总和变为 100...

就像我在游戏中移动滑块,同时为我的英雄 IDK 设置最大参数点

这个过程有库吗?也许在 numpy|sklearn 中?

您可以编写一个自定义函数来执行此操作 -- 不需要大量依赖项。请注意,此 returns 一个 new 列表;可以通过创建 class:

来进一步改进这一点
def generate_list_with_normalization(input_list, element_to_add, cap=100):
    total = sum(input_list) + element_to_add
    
    if total <= cap:
        return input_list + [element_to_add]
    return [elem * cap / total for elem in input_list + [element_to_add]]

my_list = [10, 5, 20, 30, 25, 10]
result = generate_list_with_normalization(my_list, 10, 100)
print(result)
print(sum(result))

这输出:

[9.090909090909092, 4.545454545454546, 18.181818181818183,
27.272727272727273, 22.727272727272727, 9.090909090909092, 9.090909090909092]
100.0

您可以使用:

my_list = [10, 5, 20, 30, 25, 10]
add = 10

sub = (100-sum(my_list)-add)/len(my_list)

new_list = [x+sub for x in my_list]+[add]
# [8.33, 3.33, 18.33, 28.33, 23.33, 8.33, 10]

sum(new_list)
# 100