Python嵌套字典排序:如何按PF、Q值实现多级降序排名?
问题描述
我定义了一个嵌套字典,外层键为队伍名称,每个键对应的值是包含GIOCATE、PUNTI、Q、PF、PS字段的字典,示例如下:
{'Team1': {'GIOCATE': 4, 'PUNTI': 6, 'Q': 0.9, 'PF': 63, 'PS': 70}, 'Team2': {'GIOCATE': 3, 'PUNTI': 7, 'Q': 1.1, 'PF': 44, 'PS': 40}, 'Team3': {'GIOCATE': 3, 'PUNTI': 9, 'Q': 1.514, 'PF': 53, 'PS': 35} }
我希望按以下规则排序:优先按PF值从高到低排列,若PF值相同则按Q值从高到低排列。作为Python新手,请求帮助实现该功能,预期输出格式如下:
Team7 4 10 1.07 64 60 Team2 3 9 1.51 53 35 Team1 3 9 1.09 50 46 Team4 4 8 0.935 58 62 Team5 3 7 1.1 44 40 Team3 3 7 1.0 44 44 Team8 4 7 0.955 64 67 Team6 4 6 0.964 54 56
解决方案
1. 对字典进行排序
使用Python内置的sorted()函数对字典的键值对排序,通过key参数指定双重排序规则:
- 第一优先级:按
PF字段降序排列,用-x[1]['PF']实现降序(默认排序为升序,取负数后等价于降序) - 第二优先级:当
PF值相同时,按Q字段降序排列,同样用-x[1]['Q']实现
示例排序代码:
# 你的队伍数据字典 team_stats = { 'Team1': {'GIOCATE': 4, 'PUNTI': 6, 'Q': 0.9, 'PF': 63, 'PS': 70}, 'Team2': {'GIOCATE': 3, 'PUNTI': 7, 'Q': 1.1, 'PF': 44, 'PS': 40}, 'Team3': {'GIOCATE': 3, 'PUNTI': 9, 'Q': 1.514, 'PF': 53, 'PS': 35}, 'Team4': {'GIOCATE': 4, 'PUNTI': 8, 'Q': 0.935, 'PF': 58, 'PS': 62}, 'Team5': {'GIOCATE': 3, 'PUNTI': 7, 'Q': 1.1, 'PF': 44, 'PS': 40}, 'Team6': {'GIOCATE': 4, 'PUNTI': 6, 'Q': 0.964, 'PF': 54, 'PS': 56}, 'Team7': {'GIOCATE': 4, 'PUNTI': 10, 'Q': 1.07, 'PF': 64, 'PS': 60}, 'Team8': {'GIOCATE': 4, 'PUNTI': 7, 'Q': 0.955, 'PF': 64, 'PS': 67} } # 执行排序 sorted_teams = sorted(team_stats.items(), key=lambda x: (-x[1]['PF'], -x[1]['Q']))
2. 格式化输出对齐
要得到预期的对齐格式,使用字符串格式化工具指定每个字段的宽度,确保内容整齐排列:
- 队伍名称预留25个字符宽度(左对齐)
- 数字字段分别指定宽度,保证列对齐
示例输出代码:
# 遍历排序后的队伍并输出 for team_name, stats in sorted_teams: print("{:<25} {:<5} {:<5} {:<7} {:<5} {:<5}".format( team_name, stats['GIOCATE'], stats['PUNTI'], stats['Q'], stats['PF'], stats['PS'] ))
完整可运行代码
将排序和输出逻辑整合:
team_stats = { 'Team1': {'GIOCATE': 4, 'PUNTI': 6, 'Q': 0.9, 'PF': 63, 'PS': 70}, 'Team2': {'GIOCATE': 3, 'PUNTI': 7, 'Q': 1.1, 'PF': 44, 'PS': 40}, 'Team3': {'GIOCATE': 3, 'PUNTI': 9, 'Q': 1.514, 'PF': 53, 'PS': 35}, 'Team4': {'GIOCATE': 4, 'PUNTI': 8, 'Q': 0.935, 'PF': 58, 'PS': 62}, 'Team5': {'GIOCATE': 3, 'PUNTI': 7, 'Q': 1.1, 'PF': 44, 'PS': 40}, 'Team6': {'GIOCATE': 4, 'PUNTI': 6, 'Q': 0.964, 'PF': 54, 'PS': 56}, 'Team7': {'GIOCATE': 4, 'PUNTI': 10, 'Q': 1.07, 'PF': 64, 'PS': 60}, 'Team8': {'GIOCATE': 4, 'PUNTI': 7, 'Q': 0.955, 'PF': 64, 'PS': 67} } # 排序 sorted_teams = sorted(team_stats.items(), key=lambda x: (-x[1]['PF'], -x[1]['Q'])) # 格式化输出 for team_name, stats in sorted_teams: print("{:<25} {:<5} {:<5} {:<7} {:<5} {:<5}".format( team_name, stats['GIOCATE'], stats['PUNTI'], stats['Q'], stats['PF'], stats['PS'] ))
内容的提问来源于stack exchange,提问作者Francesco Urrai
相关产品推荐
相关产品推荐

