iPod Game Guesser排行榜功能报错:TypeError排查求助
解决方案
这个错误的根源是变量名冲突,很容易犯的小疏忽!让我给你拆解清楚:
- 你一开始定义了
score = str(score),这是一个字符串类型的变量。 - 后面在循环处理每行数据时,你又用
user, score = row.split(':')重新给score赋值,这时候它变成了一个包含分数的字符串片段(比如" 100\n")。 - 最后打印的时候你写了
score[user]——这里你调用的是字符串score,而不是你创建的字典scores!字符串只能用整数当索引(比如score[0]取第一个字符),用用户名这种字符串当索引自然会报错。
第一步:修复核心错误
把最后一行的score[user]改成scores[user]就可以直接解决这个报错了。
第二步:优化代码(可选但推荐)
除了修复错误,还有几个小细节可以让你的代码更健壮、更符合Python最佳实践:
- 使用
with语句管理文件,不需要手动调用close(),避免资源泄漏 - 用
strip()处理分割后的内容,去掉多余的空格和换行符 - 增加异常处理,避免文件中无效行导致程序崩溃
修正后的完整代码:
# 写入用户分数到文件 with open("Score.txt", "a+") as leaderboard: # 直接用f-string拼接更简洁 leaderboard.write(f"{Username} : {score}\n") # 读取并解析排行榜数据 with open("Score.txt", "r") as leaderboard: score_list = leaderboard.readlines() scores = {} for row in score_list: # 先去掉行首尾的空格和换行符,再分割 cleaned_row = row.strip() if not cleaned_row: # 跳过空行 continue # 分割用户名和分数 user_part, score_part = cleaned_row.split(':') # 再分别去掉前后空格 username = user_part.strip() try: user_score = int(score_part.strip()) scores[username] = user_score except ValueError: print(f"警告:跳过无效的分数行 -> {row}") # 按分数从高到低排序用户 top_users = sorted(scores.keys(), key=lambda name: scores[name], reverse=True) # 打印排行榜 print("=== 排行榜 ===") for rank, user in enumerate(top_users, start=1): print(f"{rank}. {user} : {scores[user]}")
这样不仅解决了报错,还让你的代码更稳定,输出也更美观~
内容的提问来源于stack exchange,提问作者ProTroller
相关产品推荐
相关产品推荐

