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
相关产品推荐
相关产品推荐

