You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为多字典中的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 19:21:03