Python编程求助:如何计算参赛者的最佳/最差成绩及平均值?
解决Race Results文件处理的问题
核心问题分析
你遇到的主要问题是:
- Python字符串没有
isfloat()方法,导致判断成绩的逻辑失效 - 没有正确拆分姓名(前两个元素)和后续的10个成绩
下面是分步的解决方案:
1. 正确加载并拆分数据
根据题目要求,每行前两个元素是姓名,剩下10个是成绩,直接按索引拆分最稳妥,无需复杂的类型判断:
# 初始化存储所有参赛者数据的列表 runners = [] with open("Race_results.txt") as fh: for line in fh: # 去除首尾空白并按空格拆分每行内容 line_parts = line.strip().split() # 拼接前两个元素为姓名 full_name = " ".join(line_parts[:2]) # 剩余元素转为浮点数类型的成绩列表 race_times = [float(part) for part in line_parts[2:]] # 将当前参赛者数据存入字典,再加入总列表 runners.append({ "name": full_name, "times": race_times })
如果担心姓名可能包含更多部分(但题目明确是两位),可以用类型判断来拆分:
def is_numeric(s): try: float(s) return True except ValueError: return False runners = [] with open("Race_results.txt") as fh: for line in fh: parts = line.strip().split() name_parts = [] times = [] for part in parts: if is_numeric(part): times.append(float(part)) else: name_parts.append(part) full_name = " ".join(name_parts) runners.append({"name": full_name, "times": times})
2. 计算最佳、最差、平均成绩
利用Python内置的min()、max()、sum()函数快速计算:
for runner in runners: times = runner["times"] # 赛跑成绩越短越好,最佳成绩取最小值 runner["best_time"] = min(times) # 最差成绩取最大值 runner["worst_time"] = max(times) # 平均成绩保留两位小数 runner["avg_time"] = round(sum(times) / len(times), 2)
3. 成绩按从优到劣排序
直接对成绩列表升序排序(时间越短越靠前):
for runner in runners: runner["sorted_times"] = sorted(runner["times"])
4. 格式输出示例
假设需要格式化输出参赛者的所有统计信息:
for idx, runner in enumerate(runners, 1): print(f"第{idx}位参赛者:{runner['name']}") print(f"最佳成绩:{runner['best_time']}s") print(f"最差成绩:{runner['worst_time']}s") print(f"平均成绩:{runner['avg_time']}s") print(f"成绩排序(从优到劣):{', '.join(map(str, runner['sorted_times']))}") print("-" * 50)
你之前代码的问题修正
word.isfloat():Python字符串没有这个方法,必须通过异常捕获或自定义函数判断数值类型- 拆分逻辑错误:没有利用题目给出的"前两位是姓名"的规则,反而用了复杂的判断,增加了出错概率
内容的提问来源于stack exchange,提问作者Lostcause
相关产品推荐
相关产品推荐

