Python 中如何对字典按键(或按值)排序?
Python 字典排序:sorted(d.items(), key=lambda x: x[0]) 按键排序,x[1] 按值排序,结果是元组列表;dict() 包回去得到有序字典。本文给出各种写法。
核心:sorted(d.items(), key=lambda x: x[0]) 按键排序,key=lambda x: x[1] 按值排序。排序结果是元组列表;Python 3.7+ 字典保持插入顺序,可以再 dict() 包回字典。
按键排序
d = {"c": 3, "a": 1, "b": 2}
sorted_items = sorted(d.items(), key=lambda x: x[0])
# [('a', 1), ('b', 2), ('c', 3)]
sorted_dict = dict(sorted_items)
# {'a': 1, 'b': 2, 'c': 3}
按值排序
d = {"a": 1, "c": 3, "b": 2}
# 升序
dict(sorted(d.items(), key=lambda x: x[1]))
# {'a': 1, 'b': 2, 'c': 3}
# 降序
dict(sorted(d.items(), key=lambda x: x[1], reverse=True))
# {'c': 3, 'b': 2, 'a': 1}
简化写法
只按键排序可以不写 key 函数——d.items() 的元组默认先按第一个元素(键)比较:
dict(sorted(d.items())) # 按键升序
注意事项
- "排序后的字典"概念:3.7+ 字典有序,所以重建后的字典遍历时按排序顺序;但后续插入新键不会自动重排,修改值也不会维护按值排序;字典本质还是哈希表,不要依赖它做范围查询。
- 只需要顺序时用列表:很多场景保留元组列表就够了,不必转回字典。
常见问题(FAQ)
Q:按值排序时值相同怎么办?
A:排序稳定,保持原插入顺序;也可以加次级键:key=lambda x: (x[1], x[0])。
Q:值是数字和字符串混合?
A:数字与字符串通常无法直接排序,会抛 TypeError;int 和 float 等部分不同类型仍可比较。按业务定义统一的排序键。
Q:OrderedDict 还需要吗?
A:3.7+ 普通字典就有序,OrderedDict 仍支持高效重排、两端弹出,以及两个 OrderedDict 之间考虑顺序的相等比较;普通保留插入顺序的场景通常无需它。