用 sorted(d.items(), key=lambda x: x[1]) 按值升序排序字典,返回元组列表;需 dict() 转换才能得新字典,降序加 reverse=True,值为复杂类型时 lambda 需安全访问字段。

用 sorted() + lambda 按值排序字典
Python 字典本身无序(3.7+ 虽保持插入顺序,但不等于“可排序”),要按值排,必须转成列表。核心是用 sorted() 的 key 参数配合 lambda 提取值。
常见错误是直接对字典调 sort()(字典没这个方法),或误写 lambda x: x[1] 却忘了 sorted() 对字典默认迭代的是键,不是键值对。
-
sorted(d.items(), key=lambda x: x[1])返回list,元素是(key, value)元组 - 升序排值:默认即可;降序加
reverse=True - 如果值是字符串、
None或混合类型,会抛TypeError—— 排序前得确认值可比
data = {'a': 3, 'b': 1, 'c': 2}
sorted_items = sorted(data.items(), key=lambda x: x[1])
# → [('b', 1), ('c', 2), ('a', 3)]想得到新字典?别漏掉 dict() 转换
很多人以为 sorted() 返回字典,其实返回的是元组列表。要还原成字典,必须显式调 dict()。
容易踩的坑:用 dict(sorted(...)) 是对的,但若中间做了过滤或映射(比如只取 top3),得确保传给 dict() 的仍是两元素元组,否则报 ValueError: dictionary update sequence element #0 has length X。
立即学习“Python免费学习笔记(深入)”;
- 升序字典:
dict(sorted(data.items(), key=lambda x: x[1])) - 降序字典:
dict(sorted(data.items(), key=lambda x: x[1], reverse=True)) - 值相同怎么办?原顺序不一定保留 —— Python 3.7+
sorted()是稳定排序,只要原始items()顺序固定,等值项相对位置就固定
值是复杂类型时,lambda 得写清楚字段或逻辑
当字典值是字典、对象或元组,不能直接用 x[1] 比较。比如值是 {'score': 85, 'level': 'A'},你想按 score 排,lambda 就得访问嵌套结构。
典型错误是写成 lambda x: x[1]['score'] 却没检查 None 或缺失键,一跑就崩。
- 安全写法:
lambda x: x[1].get('score', 0) - 值是对象:
lambda x: x[1].score(需确保所有值都有该属性) - 值是元组想按第二项排:
lambda x: x[1][1]—— 注意索引越界风险
性能和兼容性:小数据无所谓,大数据注意 key 开销
lambda 本身开销极小,但若逻辑重(比如每次调用都读文件、算哈希、查数据库),排序就会变慢。这不是 lambda 的问题,而是你把副作用塞进 key 里了。
另一个隐形坑:PyPy 或旧版 CPython 对超长 lambda 行为略有差异,但日常几乎遇不到。真正要注意的是——如果你在函数里反复排序同一字典,考虑缓存结果,而不是每次都 sorted(...)。
字典值含浮点数时,注意精度问题可能让相等判断失准;含 NaN 会直接让排序失败(NaN != NaN),得先预处理。










