重新分配具有上限的 int 列表
Redistribution of int list with upper limit
我有几个数字像乐谱的一部分:
- 10 点
- 5分
- 20分
- 30 点
- 25分
- 10 点
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
我有几个数字像乐谱的一部分:
- 10 点
- 5分
- 20分
- 30 点
- 25分
- 10 点
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