如何对含重复total_points的OrderedDict条目进行二次排序?
解决方案
执行顺序:先添加平均分字段,再执行排序
排序需要用到新的「比赛位置平均分」字段,所以必须先给所有选手计算并添加该字段,再基于total_points+平均分的组合条件重新排序——原排序只考虑了单一维度,二次调整容易破坏整体降序逻辑,不如一次性用多维度条件排序更可靠。
具体实现代码示例
假设你的选手数据是键为选手ID、值为信息字典的OrderedDict,代码逻辑如下:
from collections import OrderedDict # 示例原数据(爬虫生成并已按total_points降序的OrderedDict) players = OrderedDict([ ("player_a", {"total_points": 120, "position_scores": [88, 92, 90]}), ("player_b", {"total_points": 120, "position_scores": [95, 93, 94]}), ("player_c", {"total_points": 110, "position_scores": [85, 87]}), ("player_d", {"total_points": 120, "position_scores": [86, 89, 88]}) ]) # 1. 给每个选手添加比赛位置平均分字段 for player_id, details in players.items(): # 计算平均分,处理无位置得分的边界情况 pos_scores = details.get("position_scores", []) details["position_avg"] = sum(pos_scores) / len(pos_scores) if pos_scores else 0.0 # 2. 多维度排序:先按total_points降序,相同则按position_avg降序 sorted_players = OrderedDict( sorted(players.items(), key=lambda item: (-item[1]["total_points"], -item[1]["position_avg"]) ) )
关键逻辑说明
- 排序的
key用元组(-total_points, -position_avg),负号实现降序:先比较total_points,值大的在前;当total_points相同时,再比较position_avg,值大的在前。 - 如果需要升序排列平均分,去掉对应负号即可。
- 原有的
OrderedDict排序结果可以直接覆盖,因为新排序已经包含了原排序逻辑,且补充了平均分维度。
内容的提问来源于stack exchange,提问作者Eddi
相关产品推荐
相关产品推荐

