如何按PTS值对嵌套字典中各分区球队字典降序排序?
冰球队分区字典按PTS排序无效问题解决
我在处理存储冰球队分区数据的嵌套字典时,遇到了排序不生效的问题。每个球队对应的值是包含PTS(积分)和VRP统计项的字典,需求是将每个分区内的球队按PTS值降序独立排序,但运行代码后原字典没有任何排序变化,无法得到预期结果。
原代码
dic = { "Atlantic": { "TeamA": {"PTS": 80, "VRP": 35}, "TeamB": {"PTS": 65, "VRP": 31}, "TeamC": {"PTS": 80, "VRP": 30} }, "Metropolitan": { "TeamD": {"PTS": 60, "VRP": 29}, "TeamE": {"PTS": 65, "VRP": 28} } } def ranking_sorting(ranking): for division in ranking.values(): division = dict(sorted(division.items(), key=lambda x:x[1]["PTS"], reverse = True)) ranking_sorting(dic) print(dic)
问题原因
核心问题是循环中给division变量重新赋值了排序后的新字典,但这个操作并没有修改原字典中的分区数据——division只是原分区字典的一个引用副本,重新赋值后它指向了新的字典对象,和原字典的分区条目没有任何关联,因此原字典不会被修改。
修正方案
方案1:直接修改原字典
遍历原字典的分区名称,将每个分区替换为排序后的新字典,直接修改原数据:
dic = { "Atlantic": { "TeamA": {"PTS": 80, "VRP": 35}, "TeamB": {"PTS": 65, "VRP": 31}, "TeamC": {"PTS": 80, "VRP": 30} }, "Metropolitan": { "TeamD": {"PTS": 60, "VRP": 29}, "TeamE": {"PTS": 65, "VRP": 28} } } def ranking_sorting(ranking): # 遍历每个分区的名称,直接修改原字典中的对应分区 for div_name in ranking: # 按PTS降序排序,PTS相同时按VRP降序(匹配预期结果的顺序) ranking[div_name] = dict(sorted( ranking[div_name].items(), key=lambda x: (-x[1]["PTS"], -x[1]["VRP"]) )) ranking_sorting(dic) print(dic)
方案2:返回新的排序后字典(不修改原数据)
如果需要保留原始数据,可以创建并返回一个新的排序后的字典:
dic = { "Atlantic": { "TeamA": {"PTS": 80, "VRP": 35}, "TeamB": {"PTS": 65, "VRP": 31}, "TeamC": {"PTS": 80, "VRP": 30} }, "Metropolitan": { "TeamD": {"PTS": 60, "VRP": 29}, "TeamE": {"PTS": 65, "VRP": 28} } } def ranking_sorting(ranking): sorted_ranking = {} for div_name, teams in ranking.items(): # 对当前分区的球队排序 sorted_teams = dict(sorted( teams.items(), key=lambda x: (-x[1]["PTS"], -x[1]["VRP"]) )) sorted_ranking[div_name] = sorted_teams return sorted_ranking sorted_dic = ranking_sorting(dic) print(sorted_dic)
预期输出结果
两种方案都能得到符合需求的排序结果:
{ "Atlantic": { "TeamA": {"PTS": 80, "VRP": 35}, "TeamC": {"PTS": 80, "VRP": 30}, "TeamB": {"PTS": 65, "VRP": 31} }, "Metropolitan": { "TeamE": {"PTS": 65, "VRP": 28}, "TeamD": {"PTS": 60, "VRP": 29} } }
内容的提问来源于stack exchange,提问作者Popcycle999
相关产品推荐
相关产品推荐

