Python for循环中如何计算各次迭代同键字典的键值平均值
多层循环下统计字典同键数值平均值的实现方案
实现思路
- 在所有循环的最外层定义两个统计容器,分别存储每个键的数值累计总和、每个键的出现次数,禁止将容器定义在循环内部,避免每次迭代被重置。
- 每次内层循环生成单条字典
d后,遍历字典的所有键值对,将数值累加到总和容器的对应键下,同时给计数容器的对应键计数+1。 - 所有循环执行完成后,遍历总和容器的每个键,用「累计总和 / 对应出现次数」计算平均值,整理为最终结果字典即可。
可直接复用的代码实现
原代码存在内层循环缩进错误,以下为修正后可直接运行的版本:
from collections import defaultdict # 循环最外层初始化统计容器 sum_dict = defaultdict(float) # 存储每个键的数值总和 count_dict = defaultdict(int) # 存储每个键的出现次数 for i in range(len(oneImageTest)): m = 0 for j in range(y): for k in range(x): d = {} m = m + 1 d[class_name1] = predict1 d[class_name2] = predict2 # 其余键值对赋值逻辑保持原有写法不变 # 累加当前字典的数值到统计容器 for key, val in d.items(): sum_dict[key] += val count_dict[key] += 1 # 原有逐次打印逻辑可按需保留 # print(i, d) # 循环全部结束后计算平均值 avg_result = {} for key in sum_dict: avg_result[key] = round(sum_dict[key] / count_dict[key], 2) # 保留2位小数和示例格式对齐 print(avg_result)
可选调整方案
- 如果不想引入
collections.defaultdict,可以用普通字典实现相同逻辑,累加部分替换为如下代码即可:
sum_dict = {} count_dict = {} for key, val in d.items(): if key not in sum_dict: sum_dict[key] = 0.0 count_dict[key] = 0 sum_dict[key] += val count_dict[key] += 1
round()函数的第二个参数为保留小数位数,可以根据实际精度需求自行调整。- 该逻辑天然兼容「部分键仅在少数循环中出现」的场景,比如示例中仅出现1次的
5498B_C_E_1,会自动按出现1次计算平均值,和预期输出完全匹配。
内容的提问来源于stack exchange,提问作者Calla
相关产品推荐
相关产品推荐

