Python纯实现按值降序、同分按索引升序排序索引列表的方法
Python生成符合规则的玩家排名列表解决方案
问题核心
你之前的写法存在两个问题:
- 直接对分数排序后用
index()查找对应索引,相同分数只会返回第一个匹配的索引,导致同分数玩家的索引重复 - 原代码中误将
ranking作为排序对象,逻辑上应该基于原始scores列表处理
原生实现方案
核心思路是把原索引和分数绑定后再排序,排序键同时考虑分数降序、索引升序的规则:
scores = [5, 15, 0, 25, 20, 15] # 用enumerate绑定(原索引, 分数),按(-分数, 原索引)升序排序(等价于分数降序、索引升序) sorted_items = sorted(enumerate(scores), key=lambda item: (-item[1], item[0])) # 提取排序后的原索引得到排名列表 ranking = [idx for idx, score in sorted_items] print(ranking) # 输出:[3, 4, 1, 5, 0, 2]
原理说明
enumerate(scores)会生成(索引, 分数)的元组迭代器,每个元素都和原索引一一绑定,不会出现匹配错误- 排序键
lambda item: (-item[1], item[0])的作用:- 首先取
-item[1](负的分数)作为第一排序条件:sorted默认升序,分数越高对应的负值越小,会排在更前面 - 其次取
item[0](原索引)作为第二排序条件:同分数的情况下,索引越小越靠前,完全匹配规则要求
- 首先取
内容的提问来源于stack exchange,提问作者7madaGIH
相关产品推荐
相关产品推荐

