Python处理life-expectancy.csv求取life_expectancy列最大最小值方法
代码修正说明
核心错误原因
原代码输出异常是两个逻辑问题叠加导致的:
- 遍历CSV行的循环没有保存每一行解析得到的预期寿命数值,循环结束后
split_data仅保留了文件最后一行的拆分结果。 - 此时对
split_data[3]调用max()/min(),本质是对单条预期寿命的字符串做逐字符ASCII值比较,最终返回的是字符串里的单个字符,自然出现最大值是'9'、最小值是'.'的错误结果。
具体调整内容
- 提前初始化两个追踪变量,用来全程记录遍历过程中遇到的最大、最小预期寿命值。初始值设置为符合常识的边界值(比如最大值初始设为0,最小值初始设为100,远偏离正常人类预期寿命的取值范围,不会干扰真实值比较)。
- 将数值比较逻辑移入
for循环内部:每解析完一行的预期寿命浮点值,就和当前记录的最大、最小值做对比,满足更大/更小的条件就更新追踪变量。 - 循环遍历完成后,直接输出已经记录好的最大、最小值即可。
修正后可运行代码
# 初始化极值追踪变量 max_expectancy = 0 min_expectancy = 100 with open('data/life-expectancy.csv') as life_expectancy: # 跳过表头行 next(life_expectancy) for data in life_expectancy: clean_data = data.strip() split_data = clean_data.split(',') # 按列顺序解析字段 entity = split_data[0] code = split_data[1] year = split_data[2] expectancy = float(split_data[3]) # 循环内实时更新极值 if expectancy > max_expectancy: max_expectancy = expectancy if expectancy < min_expectancy: min_expectancy = expectancy print(f'The overall max life expectancy is: {max_expectancy}') print(f'The overall min life expectancy is: {min_expectancy}')
可选简化实现
如果不想手写比较逻辑,也可以在遍历过程中把所有解析好的预期寿命值存入列表,循环结束后直接调用内置的max()/min()计算,结果完全一致:
all_expectancies = [] with open('data/life-expectancy.csv') as f: next(f) for row in f: split_row = row.strip().split(',') all_expectancies.append(float(split_row[3])) print(f'整体预期寿命最大值: {max(all_expectancies)}') print(f'整体预期寿命最小值: {min(all_expectancies)}')
内容的提问来源于stack exchange,提问作者JMC Nation
相关产品推荐
相关产品推荐

