非常游戏网
如何在Python中对字典按键或值进行排序_利用sorted函数与lambda

如何在Python中对字典按键或值进行排序_利用sorted函数与lambda

2026-05-24日常编程305143

sorted()默认对字典键排序,按值排序需用sorted(d.items(), key=lambda x: x[1])或itemgetter(1),结果为列表,转字典需dict();字符串数字键需int(x[0])转数值排序。

sorted() 默认只排键,想按值排必须显式指定 key 参数

Python 字典本身无序(3.7+ 保持插入顺序但不等于“可排序”),sorted() 对字典直接调用时,实际排序的是它的键视图:sorted(d) 等价于 sorted(d.keys())。如果目标是按值排序,必须用 key 参数告诉 sorted() 去取每个键值对的第二项。

常见错误是写成 sorted(d, key=d.values)——这会报 TypeError: 'dict_values' object is not callable,因为 d.values 是个视图对象,不是函数。

  • 正确写法是 sorted(d.items(), key=lambda x: x[1]):传入 d.items() 得到 (k,v) 元组序列,再用 lambda x: x[1] 提取每个元组的值(索引 1)作为排序依据
  • 若要降序,加 reverse=True
  • lambda x: x[0] 就是按键排序,和默认行为一致,但更明确

用 operator.itemgetter 比 lambda 更快且更清晰

当只取元组/列表固定位置的元素时,operator.itemgetter 是比 lambda 更优的选择:它底层用 C 实现,性能略高,语义也更直白。

Python 3.14.3

微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。

  • 按值排序:from operator import itemgetter,然后 sorted(d.items(), key=itemgetter(1))
  • 按键排序:sorted(d.items(), key=itemgetter(0))
  • 如果字典值是字典或对象,想按嵌套字段排(如 d[k]["score"]),itemgetter 不适用,必须用 lambda 或自定义函数

排序后还是字典?得手动转回 dict 或用 dict comprehension

sorted() 返回的是列表,不是字典。常见误解是以为 sorted(d.items(), key=...) 会返回一个新字典——它返回的是 list 类型的元组列表。

  • 转成有序字典(保留顺序):dict(sorted(d.items(), key=lambda x: x[1]))
  • 如果需要 collections.OrderedDict(仅旧版本需显式):OrderedDict(sorted(d.items(), key=lambda x: x[1]))
  • 注意:Python 3.7+ 普通 dict 插入顺序已保留,所以 dict(...) 转换后依然有序,但别误以为它“自带排序能力”

字符串键排序要注意默认是 ASCII 序,数字字符串可能排错

比如 {"10": "a", "2": "b", "1": "c"},按键升序得 ["1", "10", "2"],因为字符串比较是逐字符 ASCII 值比,"10" 的首字符 "1" 小于 "2",但 "10" 整体数值大于 "2"

  • 想按数值大小排字符串数字键:sorted(d.items(), key=lambda x: int(x[0]))
  • 健壮写法(防非数字):sorted(d.items(), key=lambda x: (x[0].isdigit() and int(x[0])) or float('inf')),或提前过滤
  • 这种问题在文件名排序(如 "img1.png", "img10.png")中高频出现,不能依赖默认字符串排序

真正容易被忽略的是:排序逻辑一旦涉及类型混合(比如值有 None、字符串、数字混在一起),lambda x: x[1] 会直接抛 TypeError;这时候必须先统一类型或加异常处理,而不是硬套模板。