如何实现输入跑者姓名计算并打印其马拉松平均成绩
问题分析与修复
你的代码存在几个关键问题,导致无法正确计算并输出指定跑者的平均成绩:
- 计算平均时错误使用了
sum(times),times是整个CSV数据集的行对象列表,并非当前跑者的三个成绩数值,根本无法直接求和。 - 找到匹配的跑者后未终止循环,若数据中存在同名跑者,会重复输出结果。
- 未处理找不到指定姓名的场景,用户输入不存在的名字时,程序没有任何反馈。
修正后的代码
import csv def racerAvg(times): name = input("Please enter racer's name: ") found = False for row in times: # 忽略大小写匹配(可选,提升用户输入容错性) if name.strip().lower() == row['name'].strip().lower(): # 提取当前跑者的三项成绩并转为整数 race_times = [int(row['boston']), int(row['chicago']), int(row['NY'])] avg_time = sum(race_times) / len(race_times) # 格式化输出,保留两位小数更直观 print(f"Average time for {name}: {avg_time:.2f}") found = True # 找到匹配项后跳出循环,避免重复处理 break # 未找到对应跑者时给出提示 if not found: print(f"Racer {name} not found in the dataset.") # 示例:读取CSV文件并调用函数 if __name__ == "__main__": with open('marathon_data.csv', mode='r') as file: # 用DictReader将每行转为字典,方便按列名取值 reader = csv.DictReader(file) # 把读取到的行转为列表传入函数 racerAvg(list(reader))
关键修改说明
- 用
race_times列表存储当前跑者的三项成绩,通过sum(race_times)计算总和后除以成绩数量得到平均值,这才是正确的计算逻辑。 - 添加
found标记和循环后的判断,处理找不到目标跑者的情况。 - 加入
strip().lower()实现大小写不敏感匹配,避免用户输入大小写不一致导致的匹配失败。 - 找到匹配项后用
break终止循环,避免重复输出结果。
内容的提问来源于stack exchange,提问作者Based Mink
相关产品推荐
相关产品推荐

