如何计算M1和E1平均分并向现有字典添加键值对、修改输出?
问题描述
需要为gradebook字典中2002、2008条目下的每个姓名计算M1和E1分数的平均分,添加键值对average: (M1+E1)/2,同时想了解如何在这两个条目下添加更多键值对。现有代码、当前输出及期望输出如下:
现有代码
gradebook = { 2002: [ {"Name" : "John"}, {"M1" : 87}, {"E1" : 10}, {"Score" : 90}, {"Grade" : "A"} ], 2008 : [ {"Name" : "Paul"}, {"M1" : 83}, {"E1" : 59}, {"Score" : 77}, {"Grade" : "C"} ], } def displayResult(gradebook): print('ID Name Grade') for i,j in gradebook.items(): print('{} {} {}'.format(i,j[0]['Name'],j[4]['Grade'])) displayResult(gradebook)
当前输出
ID Name Grade 2002 John A 2008 Paul C
期望输出
ID Name Average 2002 John 48.5 2008 Paul 71
解决方案
1. 计算并添加平均分
原数据结构中,每个年份对应一个字典列表,每个小字典仅存单个键值对。要计算平均分,遍历每个年份条目,提取M1和E1的值,计算后将{"Average": 平均分}添加到对应列表:
for year, entries in gradebook.items(): # 提取M1和E1的值 m1 = next(item["M1"] for item in entries if "M1" in item) e1 = next(item["E1"] for item in entries if "E1" in item) # 计算平均分 average = (m1 + e1) / 2 # 添加到条目列表 entries.append({"Average": average})
2. 修改显示函数以匹配期望输出
调整displayResult函数的表头和输出内容,改为展示ID、姓名和平均分:
def displayResult(gradebook): print('ID Name Average') for year, entries in gradebook.items(): name = next(item["Name"] for item in entries if "Name" in item) average = next(item["Average"] for item in entries if "Average" in item) # 格式化输出:整数平均分显示为整数,小数保留原样 display_avg = int(average) if average.is_integer() else average print('{} {} {}'.format(year, name, display_avg))
3. 完整可运行代码
整合后的完整代码如下:
gradebook = { 2002: [ {"Name" : "John"}, {"M1" : 87}, {"E1" : 10}, {"Score" : 90}, {"Grade" : "A"} ], 2008 : [ {"Name" : "Paul"}, {"M1" : 83}, {"E1" : 59}, {"Score" : 77}, {"Grade" : "C"} ], } # 计算并添加平均分 for year, entries in gradebook.items(): m1 = next(item["M1"] for item in entries if "M1" in item) e1 = next(item["E1"] for item in entries if "E1" in item) average = (m1 + e1) / 2 entries.append({"Average": average}) def displayResult(gradebook): print('ID Name Average') for year, entries in gradebook.items(): name = next(item["Name"] for item in entries if "Name" in item) average = next(item["Average"] for item in entries if "Average" in item) display_avg = int(average) if average.is_integer() else average print('{} {} {}'.format(year, name, display_avg)) displayResult(gradebook)
4. 添加更多键值对的方法
方法1:基于现有列表结构添加
直接使用列表append()方法,给目标年份的条目列表添加新的键值对字典:
# 给2002年添加出勤记录 gradebook[2002].append({"Attendance": 95})
方法2:优化数据结构(更推荐)
原列表式结构维护不便,建议将每个年份的条目改为单一字典,后续添加或修改键值对会更简单:
# 优化后的数据结构 gradebook = { 2002: { "Name": "John", "M1": 87, "E1": 10, "Score": 90, "Grade": "A" }, 2008: { "Name": "Paul", "M1": 83, "E1": 59, "Score": 77, "Grade": "C" } } # 添加平均分 gradebook[2002]["Average"] = (gradebook[2002]["M1"] + gradebook[2002]["E1"]) / 2 # 添加新键值对 gradebook[2008]["Attendance"] = 92
内容的提问来源于stack exchange,提问作者Yogesh Katta
相关产品推荐
相关产品推荐

