如何修复print_leaderboard()函数以正确打印排行榜前3名?
问题修复:分数榜无法正确显示前3名及AttributeError错误
原代码核心问题:
add_score方法未创建ScoreEntry实例,而是生成嵌套列表结构,导致后续数据处理混乱print_leaderboard作为实例方法却未定义self参数,且直接引用未定义的scoreboard变量,而非实例的self.scoreboard属性- 排序时未指定按分数排序的规则,
ScoreEntry对象默认无法直接比较大小 - 切片范围错误,
[0:2]仅能取前2条数据,取前3名需用[0:3]
修复后的完整代码:
class ScoreEntry: def __init__(self, name, score): self.name = name self.score = score # 自定义打印格式,方便查看数据 def __repr__(self): return f"{self.name}: {self.score}" class Scoreboard: def __init__(self): self.scoreboard = [] def add_score(self, name, score): # 创建标准的ScoreEntry实例,而非嵌套列表 new_entry = ScoreEntry(name, score) self.scoreboard.append(new_entry) return new_entry def print_leaderboard(self): # 按分数降序排序,指定排序依据为score属性 sorted_scores = sorted(self.scoreboard, key=lambda entry: entry.score, reverse=True) # 取前3名并打印 print("Top 3 Leaderboard:") for rank, entry in enumerate(sorted_scores[:3], start=1): print(f"{rank}. {entry.name}: {entry.score}") # 测试代码 scoreboard = Scoreboard() scoreboard.add_score('Alice', 7821) scoreboard.add_score('Bob', 12103) scoreboard.add_score('Charlie', 8762) scoreboard.add_score('Denise', 6753) # 通过实例调用方法,而非直接调用类方法 scoreboard.print_leaderboard()
修复说明:
- 统一数据结构:
add_score方法创建ScoreEntry实例,确保所有分数条目格式一致,便于排序和访问 - 修正方法定义:给
print_leaderboard添加self参数,通过self.scoreboard访问实例的分数列表;使用sorted()函数并指定key参数,按分数降序排序 - 优化输出逻辑:通过循环和序号打印前3名,输出更直观清晰
- 修正调用方式:通过实例对象调用
print_leaderboard方法,符合面向对象的调用规范
内容的提问来源于stack exchange,提问作者Nicko Toumbas
相关产品推荐
相关产品推荐

