You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确改写高分榜位次:实现相同分数共享排名

高分榜位次修正方案

问题背景

需要构建包含**位次(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

错误分析

  1. 索引错误:enumerate(l[:-1][2]) 写法逻辑混乱,l[:-1]是取排序后列表除最后一个元素外的子列表,再加上[2]会试图获取这个子列表的第三个元素,直接触发索引越界错误。
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 18:35:41