如何为多字典中的ID计算0-100区间综合得分并筛选最优ID
多字典ID最优选择方案
计算逻辑
核心采用出现次数加权的思路,避免仅在单个字典中出现的高分ID被误判为最优,具体步骤如下:
- 预处理:将每个原始分数字典转换为百分比得分,计算规则为单ID得分除以该字典所有ID得分总和乘以100,和你已有的预处理逻辑一致
- 遍历所有转换后的百分比字典,收集每个ID在所有出现过的字典中的得分,同时统计每个ID的出现次数
- 计算每个ID的初始加权得分:该ID所有百分比得分之和 × 出现次数(如果需要进一步提升多出现ID的权重,可将出现次数替换为
出现次数^n,n越大权重越高,默认取n=1即可满足大部分场景) - 对所有初始加权得分做最小-最大归一化处理,映射到0-100区间得到最终综合得分
- 取综合得分最高的ID作为最优结果
示例验证
用你给出的案例计算验证:
d1转换后得分:74701得60分、90883得40分
d2转换后得分:74701得50分、90883得50分
d3转换后得分:75853得100分
各ID初始加权得分:
- 74701:(60+50)×2=220
- 90883:(40+50)×2=180
- 75853:100×1=100
归一化到0-100后得分: - 74701:100分
- 90883:≈81.8分
- 75853:≈45.5分
最终74701为最优ID,符合预期。
Python实现代码
from collections import defaultdict def dict_to_percent(d): total = sum(d.values()) if total == 0: return {k: 0.0 for k in d} return {k: (v / total) * 100 for k, v in d.items()} def get_best_id(raw_dicts, appear_weight_power=1): # 所有字典转百分比得分 percent_dicts = [dict_to_percent(d) for d in raw_dicts] # 收集每个ID的得分列表 id_score_map = defaultdict(list) for pd in percent_dicts: for id_val, score in pd.items(): # 统一ID类型为int,避免float和int类型的同ID被识别为不同 id_int = int(id_val) id_score_map[id_int].append(score) # 计算初始加权得分 weighted_scores = {} for id_val, scores in id_score_map.items(): appear_count = len(scores) sum_s = sum(scores) weighted_scores[id_val] = sum_s * (appear_count ** appear_weight_power) # 归一化到0-100区间 max_s = max(weighted_scores.values()) min_s = min(weighted_scores.values()) final_scores = {} if max_s == min_s: final_scores = {k: 100.0 for k in weighted_scores} else: final_scores = {k: ((v - min_s) / (max_s - min_s)) * 100 for k, v in weighted_scores.items()} # 取得分最高的ID best_id = max(final_scores.items(), key=lambda x: x[1])[0] return best_id, final_scores # 测试用例 if __name__ == "__main__": d1 = {74701: 3, 90883: 2} d2 = {90883.0: 1, 74701.0: 1} d3 = {75853: 5} all_dicts = [d1, d2, d3] best_id, all_scores = get_best_id(all_dicts) print(f"最优ID:{best_id}") print(f"各ID综合得分:{all_scores}")
运行输出结果:
最优ID:74701 各ID综合得分:{74701: 100.0, 90883: 81.81818181818183, 75853: 45.45454545454545}
如果需要进一步调高多次出现ID的优先级,可在调用时将appear_weight_power参数设置为1.2、1.5等值,数值越高,对出现次数的权重倾斜越大。
内容的提问来源于stack exchange,提问作者Doof
相关产品推荐
相关产品推荐

