如何正确改写高分榜位次:实现相同分数共享排名
高分榜位次修正方案
问题背景
需要构建包含**位次(Position)、姓名(Name)、分数(Points)**的高分榜,核心要求是分数相同的用户共享同一位次(示例效果:[[1,"John",55],[2,"Anna",35],[2,"Mike",35],[3,"Tom",15]])。目前已完成分数降序排序,但位次改写的代码存在错误,无法正确生成符合要求的位次。
原错误代码:
l = [[4,"Anna",35], [2,"John",55], [1,"Tom",15], [3,"Mike",35], [5,"Sepp",35]] count = 0 for i in l: # sort the List after Points l[count][2] = int(l[count][2]) count = count + 1 l = sorted(l, key=lambda x: x[2], reverse=True) position = 1 for i, j in enumerate(l[:-1][2]): # rewrite the Position if j == l[i + 1][2]: l[i][0] = position l[i + 1][0] = position else: l[i][0] = position position = position + 1
错误分析
- 索引错误:
enumerate(l[:-1][2])写法逻辑混乱,l[:-1]是取排序后列表除最后一个元素外的子列表,再加上[2]会试图获取这个子列表的第三个元素,直接触发索引越界错误。 - 逻辑漏洞:仅处理相邻两个元素的位次,若存在多个同分数用户(比如示例中的3个35分用户),后续用户的位次无法被正确设置;同时完全遗漏了最后一个元素的位次赋值。
修正后的代码
# 原始数据 scores = [[4,"Anna",35], [2,"John",55], [1,"Tom",15], [3,"Mike",35], [5,"Sepp",35]] # 统一转换分数为整数类型 for item in scores: item[2] = int(item[2]) # 按分数降序排序 scores_sorted = sorted(scores, key=lambda x: x[2], reverse=True) # 初始化位次和前一个分数变量 current_position = 1 prev_points = scores_sorted[0][2] # 遍历设置位次 for idx, item in enumerate(scores_sorted): current_points = item[2] # 分数变化时更新位次为当前索引+1(索引从0开始,对应实际位次) if current_points != prev_points: current_position = idx + 1 prev_points = current_points # 赋值当前位次 item[0] = current_position # 输出结果 print(scores_sorted)
关键逻辑说明
- 遍历排序后的列表时,通过对比当前用户与前一个用户的分数,判断是否需要更新位次:
- 分数相同则沿用当前位次
- 分数不同则将位次设为当前索引+1(因为列表索引从0开始,加1后对应实际位次)
- 覆盖所有元素,包括最后一个用户,解决了原代码的遗漏问题
- 支持任意数量的同分数用户,确保他们共享同一位次
内容的提问来源于stack exchange,提问作者dan969696
相关产品推荐
相关产品推荐

