Python实现人员-分数映射、总分计算及升序排序问题求助
高尔夫球员分数统计与排名实现方案
需求说明
读取包含球员姓名和多轮分数的文件golf.txt,完成以下操作:
- 计算每位球员的总分并关联对应姓名
- 按总分升序排序(最低分排第一,最高分排最后)
- 在终端输出排名(FIRST、SECOND、THIRD、LAST)
输入示例
Bob Jones:4,6,3,3,4,3,5,5,4,4,3,3,2,3,4,3,4,4 Ted Smith:3,3,3,3,4,3,5,5,4,3,3,3,2,3,4,3,4,4 Taylor Martin:4,4,3,3,4,3,5,6,4,4,4,3,2,3,5,3,5,4
现有代码的问题
- 遍历文件行时直接覆盖
name和score变量,仅保留最后一行数据,丢失前面所有球员信息 - 计算总分时未将字符串类型的分数转为整数,直接执行加法会触发类型错误
- 未建立姓名与总分的关联存储,无法进行排序和排名
- 仅实现了单个球员的分数累加过程,未完成所有球员的统计
修正后的代码
# 存储球员姓名与对应总分的字典 player_totals = {} with open('golf.txt', 'r') as f: for line in f: # 去除换行符,跳过空行 line = line.strip() if not line: continue # 分割姓名和分数段 name, score_str = line.split(':') # 将分数字符串转为整数列表并计算总分 scores = list(map(int, score_str.split(','))) total = sum(scores) # 存入字典 player_totals[name] = total # 按总分升序排序,得到(姓名, 总分)的有序列表 sorted_players = sorted(player_totals.items(), key=lambda x: x[1]) # 输出排名结果 if sorted_players: print(f"FIRST:{sorted_players[0][0]}") if len(sorted_players) >= 2: print(f"SECOND:{sorted_players[1][0]}") if len(sorted_players) >= 3: print(f"THIRD:{sorted_players[2][0]}") print(f"LAST:{sorted_players[-1][0]}")
代码说明
- 数据存储:用字典
player_totals存储每个球员的姓名和总分,避免遍历过程中数据被覆盖 - 分数处理:通过
map(int, ...)将字符串分数转为整数,再用sum()直接计算总分,简洁高效 - 排序逻辑:使用
sorted()结合lambda表达式,按总分升序排列球员列表 - 排名输出:根据排序后的列表长度,灵活输出FIRST、SECOND、THIRD和LAST,兼容球员数量不足4的情况
测试输出
针对输入示例,执行代码后会输出:
FIRST:Ted Smith SECOND:Taylor Martin THIRD:Bob Jones LAST:Bob Jones
内容的提问来源于stack exchange,提问作者Chammalie
相关产品推荐
相关产品推荐

