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:Python 3 混合类型比较抛 TypeError,先统一类型。
Q:OrderedDict 还需要吗?
A:3.7+ 普通字典就有序,OrderedDict 只剩一些特殊方法(move_to_end 等),一般场景不再需要。