繁体   English   中英

获取python嵌套字典中子值的平均值

[英]Get average of sub values in python nested dictionary

我有一个情况,我有一个表(从 excel 导入)机智要求和子要求,可以像这个例子一样看到:

+-------------+--------+
| Requeriment | Points |
+-------------+--------+
| 1           |        |
+-------------+--------+
| 2           |        |
+-------------+--------+
| 3           |        |
+-------------+--------+
| 3.1         |        |
+-------------+--------+
| 3.2         |        |
+-------------+--------+
| 3.3         |        |
+-------------+--------+
| 4           |        |
+-------------+--------+
| 5           |        |
+-------------+--------+
| 5.1         |        |
+-------------+--------+
| 5.2         |        |
+-------------+--------+
| 5.2.1       |        |
+-------------+--------+
| 5.2.1.1     |        |
+-------------+--------+
| 5.3         |        |
+-------------+--------+
| 6           |        |
+-------------+--------+


所有需求最大值为'1.0',如果存在需求有子需求的情况,则需求值= sum(subrequirments)/total subrequirments,它也适用于子需求和子需求。

在这里,我展示了如何对没有子要求的要求进行评估,如果它不完整,则为 0,如果已完成,则为 1.0。

在此处输入图片说明

带有子要求的要求将通过以下公式进行评估:要求点=子要求的总和/子要求的值。 值将是这样的:

在此处输入图片说明

这张表被转换成这样的字典:

{requeriments:{
 '1':{'points':'', subrequeriments: {}},
 '2':{'points':'', subrequeriments: {}},
 '3':{'points':'', subrequeriments: {
    '3.1':{'points':'', subrequeriments: {} },
    '3.2':{'points':'', subrequeriments: {} },
    '3.3':{'points':'', 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':'', subrequeriments: {}
         }

        } 
      },
    '5.3':{'points':'', subrequeriments: {} }
   }
  },
 '6':{'points':'', subrequeriments: {}}
 }
}

最后,我无法得到一个很好的方法来评估在嵌套子要求中应用函数要求值 = sum(subrequirments)/total subrequirments 的要求。

你知道一种将它应用到字典上的好方法,或者至少一种将它应用到丢失或桌子上的好方法吗?

使用递归函数:

def calcPoints(d):
    points = 0
    for k,v in d.items():
        if v['points'] == '':
            v['points'] = calcPoints(v['subrequirements'])
        points += float(v['points'])
    return str(points / max(1,len(d)))

输入:

data = {'requeriments': 
{'1': {'points': '1', 'subrequirements': {}}, 
 '2': {'points': '0', 'subrequirements': {}}, 
 '3': {'points': '', 'subrequirements': 
    {'3.1': {'points': '1', 'subrequirements': {}},
     '3.2': {'points': '0', 'subrequirements': {}},
     '3.3': {'points': '1', 'subrequirements': {}}}}, 
 '4': {'points': '1', 'subrequirements': {}}, 
 '5': {'points': '', 'subrequirements': 
    {'5.1': {'points': '1', 'subrequirements': {}},
     '5.2': {'points': '', 'subrequirements': 
          {'5.2.1': {'points': '', 'subrequirements': 
                  {'5.2.1.1': {'points': '1', 'subrequirements': {}}, 
                   '5.2.1.2': {'points': '0', 'subrequirements': {}}}}, 
           '5.2.2': {'points': '0', 'subrequirements': {}}}},
     '5.3': {'points': '1', 'subrequirements': {}}}}, 
 '6': {'points': '0', 'subrequirements': {}}}}

输出:

calcPoints(data['requeriments']) # '0.5694444444444444'

print(data)

{'requeriments': 
 {'1': {'points': '1', 'subrequirements': {}}, 
  '2': {'points': '0', 'subrequirements': {}}, 
  '3': {'points': '0.6666666666666666', 'subrequirements': 
     {'3.1': {'points': '1', 'subrequirements': {}}, 
      '3.2': {'points': '0', 'subrequirements': {}}, 
      '3.3': {'points': '1', 'subrequirements': {}}}}, 
  '4': {'points': '1', 'subrequirements': {}}, 
  '5': {'points': '0.75', 'subrequirements': 
     {'5.1': {'points': '1', 'subrequirements': {}}, 
      '5.2': {'points': '0.25', 'subrequirements': 
           {'5.2.1': {'points': '0.5', 'subrequirements': 
                   {'5.2.1.1': {'points': '1', 'subrequirements': {}}, 
                    '5.2.1.2': {'points': '0', 'subrequirements': {}}}}, 
            '5.2.2': {'points': '0', 'subrequirements': {}}}}, 
      '5.3': {'points': '1', 'subrequirements': {}}}}, 
  '6': {'points': '0', 'subrequirements': {}}}}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM