Python体育种子排序问题:州级选手无法排至顶部求因
问题分析与解决
核心问题
你的代码存在几个关键错误,导致排序逻辑完全未生效:
字典遍历与键名错误:
for x in seeded_players遍历的是字典的键(即2、3、1这些整数),而非选手的信息字典,因此x["State"]会直接触发KeyError(你运行未报错是因为这个if分支根本没执行)。另外选手字典里的状态键是小写的state,你写的是大写State,大小写不匹配。排序方法误用:
x.sort(-1)完全不符合Python语法——整数没有sort方法,且sort是列表的内置方法,字典无法通过这种方式调整顺序。排序函数未调用:你定义了
state_sorting函数,但全程没有调用它,里面的逻辑根本没执行,最后print的还是原始的seeded_players字典。字典无序性(旧Python版本):Python 3.7之前的普通
dict是无序的,即使修改内容,输出顺序也不固定;3.7+虽保留插入顺序,但仍需主动生成排序后的结构。
修正后的代码
要实现将state=1的选手排在最前面,可将字典转为列表按规则排序,再转回字典:
seeded_players = { 2: {'name': 'George', "highschool": "AHS", "win_rate": 0, "state": "", "regionals": 6}, 3: {'name': 'George', "highschool": "SCHS", "win_rate": 0, "state": "", "regionals": ""}, 1: {'name': 'Bob', "highschool": "SHS", "win_rate": 0.4, "state": 1, "regionals": 4}, } def state_sorting(players): # 将字典键值对转为列表,按state是否为1排序(state=1的项排前) sorted_items = sorted(players.items(), key=lambda item: 0 if item[1]['state'] == 1 else 1) # 转回字典(Python3.7+普通dict保留插入顺序) return dict(sorted_items) # 调用排序函数并更新原字典 seeded_players = state_sorting(seeded_players) print(seeded_players)
运行结果
执行python3 seeding.py后,输出为:
{1: {'name': 'Bob', 'highschool': 'SHS', 'win_rate': 0.4, 'state': 1, 'regionals': 4}, 2: {'name': 'George', 'highschool': 'AHS', 'win_rate': 0, 'state': '', 'regionals': 6}, 3: {'name': 'George', 'highschool': 'SCHS', 'win_rate': 0, 'state': '', 'regionals': ''}}
关键说明
sorted(players.items(), key=lambda item: 0 if item[1]['state'] == 1 else 1):通过key指定排序规则,让state=1的项返回0(优先级更高),其他项返回1,从而实现前置排序。- 若使用Python3.7以下版本,可导入
collections.OrderedDict,将排序后的列表转为OrderedDict来保存有序结构。
内容的提问来源于stack exchange,提问作者Wepwawet
相关产品推荐
相关产品推荐

