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

Python嵌套字典中计算多层级需求及其子需求平均得分的方法

多级需求得分计算实现方案

适配嵌套字典结构的实现方案

核心逻辑采用递归自底向上计算,先完成所有子级需求的得分计算,再推导父级得分,完全匹配给定的评分规则。

代码实现(Python)

def calculate_requirement_points(req_node):
    # 无直属子需求:为末级节点,直接返回提前人工录入的0/1得分
    if not req_node['subrequeriments']:
        # 空值默认设为0,可根据实际业务调整规则
        req_node['points'] = float(req_node['points']) if req_node['points'] else 0.0
        return req_node['points']
    
    # 有直属子需求:递归计算所有子节点得分,再求平均值作为当前节点得分
    sub_points_sum = 0.0
    sub_count = len(req_node['subrequeriments'])
    for sub_node in req_node['subrequeriments'].values():
        sub_points_sum += calculate_requirement_points(sub_node)
    
    # 得分保留2位小数,可按需调整精度
    req_node['points'] = round(sub_points_sum / sub_count, 2)
    return req_node['points']

# 全局计算入口
def calc_all_points(req_data):
    for top_node in req_data['requeriments'].values():
        calculate_requirement_points(top_node)
    return req_data

使用示例

提前给所有末级需求的points字段赋值0或1,调用入口函数即可自动回填所有层级父需求的得分:

# 测试数据示例:给3.1、3.3、5.2.1.1赋值1分,3.2赋值0分
test_data = {
    'requeriments':{
        '1':{'points':'', 'subrequeriments': {}},
        '2':{'points':'', 'subrequeriments': {}},
        '3':{'points':'', 'subrequeriments': {
            '3.1':{'points':'1', 'subrequeriments': {} },
            '3.2':{'points':'0', 'subrequeriments': {} },
            '3.3':{'points':'1', 'subrequeriments': {} }
        }},
        '4':{'points':'', 'subrequeriments': {}},
        '5':{'points':'', 'subrequeriments': {
            '5.1':{'points':'', 'subrequeriments': {} },
            '5.2':{'points':'', 'subrequeriments': {
                '5.2.1':{'points':'', 'subrequeriments': {
                    '5.2.1.1':{'points':'1', 'subrequeriments': {} }
                }}
            }},
            '5.3':{'points':'', 'subrequeriments': {} }
        }},
        '6':{'points':'', 'subrequeriments': {}}
    }
}

result = calc_all_points(test_data)
# 输出结果:3的得分为(1+0+1)/3≈0.67,5.2的得分为1
print(result['requeriments']['3']['points'])
print(result['requeriments']['5']['subrequeriments']['5.2']['points'])

平表/Excel结构的实现思路

如果原始数据是Excel导出的平级列表(每行对应一个需求,包含需求编号、得分两列),可按以下步骤处理:

  1. 提取所有需求编号,按编号的层级深度倒序排序(编号的段数越多层级越深,比如5.2.1.1是4段,优先级高于3段的5.2.1)
  2. 建立需求编号到得分的映射表
  3. 按倒序遍历所有需求:
    • 末级需求(没有其他需求的编号前缀等于当前编号),直接取人工录入的0/1得分
    • 父级需求,找到所有编号以它为前缀的直属子需求,计算平均得分存入映射表
  4. 遍历完成后把映射表的得分回填到原表格即可

内容的提问来源于stack exchange,提问作者Juan049

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:45:01