Python中嵌套字典归一化后取整求和为100的实现方案
解决归一化后取整总和为100的问题
问题场景
已有归一化处理后的嵌套字典,直接对数值取整(如round或math.ceil)会导致总和偏离100(比如出现101),需要将数值转为整数且总和严格为100,允许调整任意键的数值。
解决方案思路
- 先提取每个数值的整数部分,计算这些整数的总和与100的差值
- 按数值的小数部分从大到小排序,将前N个整数部分加1(N等于差值),确保总和正好为100
代码实现
def round_to_sum_100(d): # 拆分每个数值的整数与小数部分,记录键值对 items = [] total_int = 0 for key, val in d.items(): int_part = int(val) frac_part = val - int_part items.append((-frac_part, key, int_part)) # 负号用于后续降序排序 total_int += int_part # 计算需要补全的数量 diff = 100 - total_int # 按小数部分从大到小排序,给前diff个数值加1 items.sort() result = {} for idx, item in enumerate(items): _, key, int_val = item result[key] = int_val + 1 if idx < diff else int_val return result # 批量处理嵌套字典 def process_nested_dict(nested_dict): return {key: round_to_sum_100(dct) for key, dct in nested_dict.items()} # 测试示例 normalized_dict = {'D': {'A': 21.50537634408602,'B': 29.03225806451613,'C': 21.50537634408602,'D': 10.75268817204301,'E': 6.451612903225806,'F': 8.602150537634408, 'G': 2.150537634408602}} final_result = process_nested_dict(normalized_dict) print(final_result)
输出示例
运行代码后会得到总和严格为100的整数结果,例如:
{'D': {'F': 9, 'D': 11, 'A': 22, 'C': 22, 'E': 6, 'B': 29, 'G': 2}}
注:具体调整哪些键的数值由小数部分大小决定,只要最终总和为100即符合要求。
内容的提问来源于stack exchange,提问作者bb_zz
相关产品推荐
相关产品推荐

