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

Python中计算球员在新旧积分列表中的排名升降

嘿,这个需求其实很好实现,我给你一步步拆解,附上具体代码示例,你一看就懂~

实现思路与代码示例

核心逻辑就是:先记录积分更新前的球员排名,更新积分后再算出新排名,最后对比每个球员的新旧排名,就能得到升降位数了。

1. 编写通用排名计算函数

首先我们需要一个可复用的函数,输入球员列表,输出每个球员对应的排名字典(键是球员名,值是排名)。这里还考虑了积分并列的情况(比如两个球员积分相同,排名一致),如果不需要并列逻辑,直接简化就行。

def calculate_player_ranks(player_list):
    # 按积分降序排序,积分相同的话按球员名排序(保证排序稳定性)
    # 注意:如果你的积分是字符串类型,要转成int,比如 int(x[2])
    sorted_players = sorted(player_list, key=lambda x: (-int(x[2]), x[0]))
    
    rank_dict = {}
    current_rank = 1
    
    for idx, player in enumerate(sorted_players):
        # 处理并列排名:如果当前球员和前一个积分相同,排名不变
        if idx > 0 and player[2] == sorted_players[idx-1][2]:
            rank_dict[player[0]] = current_rank
        else:
            # 否则排名更新为当前位置+1(因为索引从0开始)
            current_rank = idx + 1
            rank_dict[player[0]] = current_rank
    
    return rank_dict

2. 保存更新前的排名

先把原始列表的排名存下来,用字典存储方便后续快速查找每个球员的旧排名:

# 你的原始球员列表(积分更新前)
original_players = [["player1", "team1", "10"], ["player2", "team2", "15"], ["player3", "team1", "10"]]

# 计算并保存旧排名
old_ranks = calculate_player_ranks(original_players)

如果需要保留完整的旧列表数据(防止后续修改影响),可以深拷贝一份:

import copy
old_players_copy = copy.deepcopy(original_players)

3. 执行积分更新

这一步就是你自己的业务逻辑了,比如某球员打完比赛后调整积分,举个模拟例子:

# 模拟积分更新:player1加5分,player2减2分
updated_players = [["player1", "team1", "15"], ["player2", "team2", "13"], ["player3", "team1", "10"]]

4. 计算新排名并对比升降

算出更新后的排名,然后遍历每个球员,对比新旧排名得出升降情况:

# 计算新排名
new_ranks = calculate_player_ranks(updated_players)

# 遍历每个球员,输出排名变化
for player_name in old_ranks:
    old_rank = old_ranks[player_name]
    new_rank = new_ranks[player_name]
    rank_change = old_rank - new_rank
    
    if rank_change > 0:
        print(f"{player_name}: 上升了 {rank_change} 位(旧排名{old_rank} → 新排名{new_rank})")
    elif rank_change < 0:
        print(f"{player_name}: 下降了 {-rank_change} 位(旧排名{old_rank} → 新排名{new_rank})")
    else:
        print(f"{player_name}: 排名不变(旧排名{old_rank} → 新排名{new_rank})")

关键说明

  • 如果你的积分是字符串格式(比如示例里的"pointsPlayer1"),一定要转成整数/浮点数再排序,否则会按字符串字典序排序,结果会出错。
  • 并列排名的逻辑可以根据你的需求调整:比如不需要并列的话,直接给每个球员按索引+1赋值排名就行,去掉判断积分相同的代码。
  • 球员数量从0到20都适用,这个逻辑不受数量限制。

内容的提问来源于stack exchange,提问作者FlugtN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:12:16