Python技术问题:如何计算字典中model_year字段的平均值
问题排查与解决:用reduce计算车辆年份平均值的错误处理
报错根源分析
- 数据类型不匹配:CSV默认读取的所有字段都是字符串,直接对
model_year字符串做累加会触发类型错误(比如试图把整数和字符串相加)。 - 无效/缺失数据:手动添加的条目或CSV中存在
model_year为空、非数字的情况,导致累加时出现异常。 - reduce初始值错误:如果reduce的初始值类型与累加值不匹配(比如初始值是字符串,要加整数),也会抛出类型错误。
正确实现代码
第一步:确保数据类型正确(读取CSV+手动添加数据)
import csv from functools import reduce # 读取CSV并转换model_year为整数,过滤无效数据 vehicleInventory = [] with open('vehicles.csv', 'r', newline='') as csvfile: reader = csv.DictReader(csvfile) for row in reader: try: # 强制转换为整数,跳过无效值 row['model_year'] = int(row['model_year'].strip()) vehicleInventory.append(row) except (ValueError, KeyError): # 处理年份缺失或非数字的情况:直接跳过该条目 pass # 添加手动车辆数据(确保model_year为整数类型) vehicleInventory.extend([ {"model_year": 2021, "make": "Tesla", "model": "Model 3"}, {"model_year": 2019, "make": "Chevrolet", "model": "Silverado"}, {"model_year": 2023, "make": "Hyundai", "model": "Sonata"} ])
第二步:用reduce计算平均值
# 先检查是否有有效数据,避免除以0 if len(vehicleInventory) == 0: print("无有效车辆数据可计算") else: # 用reduce累加所有年份总和,初始值设为0(整数类型) total_years = reduce(lambda acc, veh: acc + veh['model_year'], vehicleInventory, 0) average_year = total_years / len(vehicleInventory) print(f"车辆平均年份:{average_year:.2f}")
关键注意事项
- 类型校验:所有参与计算的
model_year必须是整数/浮点数,读取CSV时一定要做类型转换,同时处理异常值。 - 初始值设置:reduce的第三个参数(初始值)必须是数值类型(比如0),保证累加操作从正确的类型开始。
- 空数据处理:计算平均值前先判断数据列表是否为空,避免出现
ZeroDivisionError。
内容的提问来源于stack exchange,提问作者Conn kal
相关产品推荐
相关产品推荐

