sorted()默认对字典键排序,非值;按值排序需用sorted(d.items(), key=lambda x: x[1]),3.7+可用dict()还原,混合类型或none会导致typeerror。

sorted() 默认按字典键排序,不是值
直接对字典调用 sorted(),比如 sorted(my_dict),实际排的是键(keys),不是你想要的值(values)。这是新手最常踩的坑——以为字典本身可“直接排序”,其实它无序,且 sorted() 对字典的默认迭代对象是键。
真正要按值排序,必须显式告诉 Python:拿哪个东西来比。常用方式是把字典转成键值对序列(dict.items()),再用 key 参数指定比较依据。
-
sorted(my_dict.items(), key=lambda x: x[1])→ 按值升序,返回list形式的元组对,如[('b', 1), ('a', 3), ('c', 5)] -
sorted(my_dict.items(), key=lambda x: x[1], reverse=True)→ 按值降序 - 注意:
x[1]是每个(key, value)元组里的值;x[0]才是键
lambda 中访问 value 的常见写法差异
写 lambda x: x[1] 最直接,但可读性略差。如果字典值是复杂类型(比如嵌套字典、对象),容易出错。这时可以改用命名解包或 operator.itemgetter 提升健壮性。
-
lambda item: item[1]和lambda kv: kv[1]效果一样,只是变量名不同,不推荐用x这种模糊名 - 更清晰的写法:
lambda k_v: k_v[1]或直接from operator import itemgetter; key=itemgetter(1) - 若值是字典,比如
{'a': {'score': 92}},不能写lambda x: x[1]['score']—— 要先确保x[1]不为None,否则抛TypeError
排序后想还原成字典?注意 Python 版本兼容性
Python 3.7+ 保证字典插入顺序,所以可以用 dict(sorted(...)) 安全转回字典;3.6 只在 CPython 实现中保序,3.5 及更早版本则完全不保序,转回去也白搭。
-
dict(sorted(my_dict.items(), key=lambda x: x[1]))→ 3.7+ 可用,结果字典按键值对排序后顺序存储 - 如果目标环境不确定版本,别依赖字典顺序,改用
collections.OrderedDict(3.7 后已不推荐,仅兼容旧版) - 不要写
my_dict.sort()—— 字典没有sort()方法,会报AttributeError
遇到 None 或混合类型值时排序会失败
sorted() 在比较时要求所有值能互相比较。如果字典里混了 None、字符串和数字,比如 {'a': 5, 'b': None, 'c': 'hello'},直接按值排序会触发 TypeError: '。
- 解决办法:在
lambda中预处理,例如key=lambda x: (x[1] is None, x[1])—— 把None当作最小(或最大)统一排在前面(或后面) - 或者过滤掉异常值:
sorted([(k,v) for k,v in my_dict.items() if v is not None], key=lambda x: x[1]) - 字符串和数字混排(如
'10'和2)也会出错,需统一转类型,但要注意隐式转换风险(比如int('abc')报错)
None、类型不一致、旧 Python 版本兼容性这些细节。动手前先用 print(list(my_dict.items())) 看一眼真实数据结构,比硬套 lambda 更省时间。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











