如何仅用字典推导式或函数式编程实现嵌套字典指定键值求和?
不用显式for循环,用函数式/字典推导式处理嵌套字典求和的方案
嘿,我太懂你搜不到纯函数式或字典推导式方案的苦恼了!之前我找类似方法的时候也发现相关资料不多,刚好针对你这个需求,整理了几种完全符合要求的实现方式,不用写传统的for循环就能搞定:
方法1:生成器表达式 + sum(最简洁高效)
这种写法用隐式的生成器遍历嵌套字典,既贴合函数式编程思路,又没有显式的for循环:
def get_grades(nested_dict, target_key): return sum(student_scores.get(target_key, 0) for student_scores in nested_dict.values())
说明:
nested_dict.values()拿到所有学生的成绩字典- 生成器表达式遍历每个学生字典,用
get()方法安全获取目标键的值(避免不存在该键时报错,默认返回0) - 最后用
sum()直接对所有目标值求和
方法2:map函数 + lambda(纯函数式风格)
如果你更倾向于纯函数式的写法,用map配合lambda也能完美实现:
def get_grades(nested_dict, target_key): return sum(map(lambda scores: scores.get(target_key, 0), nested_dict.values()))
说明:
map()把每个学生的成绩字典传入lambda函数,提取目标键对应的值- 再用
sum()对map返回的迭代器中的数值求和
方法3:字典推导式配合sum(满足字典推导式需求)
如果一定要用到字典推导式,我们可以先生成一个包含目标值的临时字典,再对其值求和:
def get_grades(nested_dict, target_key): target_values = {name: scores.get(target_key, 0) for name, scores in nested_dict.items()} return sum(target_values.values())
说明:
- 字典推导式遍历每个学生的键值对,生成以学生名为键、目标作业成绩为值的字典
- 最后对这个字典的所有值求和
测试示例
用你给出的测试数据验证:
sample_dict = {'Ggg':{'hw1': 1, 'hw2': 2, 'hw3': 3},'Hhh':{'hw1': 4, 'hw2': 3,'hw3': 6}} print(get_grades(sample_dict, 'hw1')) # 输出:5 print(get_grades(sample_dict, 'hw3')) # 输出:9
内容的提问来源于stack exchange,提问作者boosie
相关产品推荐
相关产品推荐

