Python中如何访问嵌套列表字典并实现加权平均计算?
解决嵌套列表字典的加权平均计算问题
你遇到的TypeError核心原因是:直接对字典items()返回的键值对元组执行乘法操作,而没有深入到嵌套列表的单个数值层级进行运算。要完成每个时间步的加权平均计算,需要逐层遍历嵌套列表,将对应位置的平均值和面积相乘后累加,再除以总面积。
假设数据结构示例
先明确典型的字典嵌套列表结构(方便后续代码对应):
avg_out = { "time_step_1": [[1.2, 3.4], [5.6]], "time_step_2": [[2.3, 4.5], [6.7, 8.9]] } area_out = { "time_step_1": [[10, 20], [30]], "time_step_2": [[15, 25], [35, 45]] }
固定层级嵌套的解决方案
如果你的嵌套列表层级固定(比如两层),可以用多层zip逐层遍历:
# 存储每个时间步的最终计算结果 final_avg = {} # 遍历每个时间步(确保两个字典的时间步键完全匹配) for step in avg_out: avg_data = avg_out[step] area_data = area_out[step] weighted_total = 0.0 total_area = 0.0 # 遍历外层列表(如不同区域组) for avg_sub, area_sub in zip(avg_data, area_data): # 遍历内层列表(单个区域的数值点) for avg_val, area_val in zip(avg_sub, area_sub): weighted_total += avg_val * area_val total_area += area_val # 计算最终平均值,避免除以0的异常 final_avg[step] = weighted_total / total_area if total_area != 0 else 0.0 print(final_avg)
任意深度嵌套的解决方案
如果嵌套列表的层级不固定,可以用递归函数处理任意深度的结构:
def calculate_weighted_sum(avg_nested, area_nested): weighted_sum = 0.0 total_area = 0.0 for avg_item, area_item in zip(avg_nested, area_nested): if isinstance(avg_item, list) and isinstance(area_item, list): # 递归处理更深层级的嵌套 sub_sum, sub_area = calculate_weighted_sum(avg_item, area_item) weighted_sum += sub_sum total_area += sub_area else: weighted_sum += avg_item * area_item total_area += area_item return weighted_sum, total_area # 执行计算 final_avg = {} for step in avg_out: ws, ta = calculate_weighted_sum(avg_out[step], area_out[step]) final_avg[step] = ws / ta if ta != 0 else 0.0 print(final_avg)
关键注意点
- 必须确保两个字典的时间步键完全一致,否则会出现数据不匹配的问题
- 加入除以0的判断,避免运行时抛出
ZeroDivisionError - 多层嵌套必须逐层对应遍历,不能直接对整个列表做乘法运算
内容的提问来源于stack exchange,提问作者SAVen
相关产品推荐
相关产品推荐

