如何按花名册编号排序Python字典?已尝试sorted与lambda,是否用SortedDict?
按花名册编号排序字典的解决方案
首先明确你当前代码的问题:
- 你写的
sorted(Roster1, key = lambda x:x[0])完全起不到按编号排序的作用——lambda取的是键的第一个字符(所有键都是以'p'开头),等于没做有效排序;而且sorted函数返回的是排序后的键列表,你没保存这个结果,直接打印原字典自然看不到变化。 - 另外,Python 3.7及以上版本的普通字典已经默认保留插入顺序,你当前的字典键是按
player 1到player 4依次添加的,本身就是有序的,但如果后续出现键顺序被打乱、或者需要通用的编号排序逻辑,就得调整写法。
方案一:用sorted处理键,遍历排序后的结果(无需SortedDict)
这是最直接的解决方式,不需要额外依赖。只要修正排序的key逻辑,提取键里的数字部分作为排序依据,再遍历排序后的键列表输出即可:
Roster1={ 'player 1':[], 'player 2':[], 'player 3':[], 'player 4':[] } for n in range(4): jersey=int(input(f"Enter player {n}'s jersey number:\n")) rating=int(input(f"Enter player {n}'s rating number:\n")) Roster1[f"player {n+1}"]=(jersey, rating) # 正确排序键:提取player后面的数字转为整数作为排序依据 sorted_players = sorted(Roster1.keys(), key=lambda x: int(x.split()[1])) # 遍历排序后的键输出 for player in sorted_players: jersey, rating = Roster1[player] print(f'Jersey number: {jersey}, Rating: {rating}')
方案二:使用SortedDict(仅当字典需始终保持排序时用)
如果你的场景需要字典在后续添加、删除球员时,始终自动按编号维持排序状态,才需要用到SortedDict(注意是第三方库sortedcontainers中的实现,Python标准库的OrderedDict仅保留插入顺序,不会自动排序)。步骤如下:
- 先安装依赖:
pip install sortedcontainers - 修改代码:
from sortedcontainers import SortedDict # 定义排序规则:按player编号的整数大小排序 def sort_key(player): return int(player.split()[1]) # 初始化SortedDict并指定排序key Roster1 = SortedDict(key=sort_key) # 即使乱序添加球员,字典也会自动按编号排序 Roster1['player 3'] = (12, 90) Roster1['player 1'] = (8, 85) Roster1['player 4'] = (23, 95) Roster1['player 2'] = (5, 88) # 直接遍历就是排序后的结果 for player in Roster1: jersey, rating = Roster1[player] print(f'Jersey number: {jersey}, Rating: {rating}')
总结
- 如果你只是一次性排序输出结果,用方案一就足够,完全不需要
SortedDict; - 只有当需要字典长期保持排序状态(动态增删时自动维护顺序),才需要考虑使用
SortedDict。
内容的提问来源于stack exchange,提问作者Grace Mcpadden
相关产品推荐
相关产品推荐

