sorted()配合lambda可对字典列表按键排序,不修改原列表;list.sort()则原地排序且支持reverse控制升降序,但要求数据为列表且键值类型一致。

用 sorted() 配合 lambda 按键取值排序
Python 里对字典列表按某个键排序,最常用也最直接的方式是用内置 sorted() 函数配合 lambda 表达式。它不修改原列表,返回新列表,适合多数场景。
-
sorted(list_of_dicts, key=lambda x: x['name'])—— 按'name'键升序排列 - 如果键可能不存在,
lambda x: x.get('age', 0)可避免KeyError,缺失时用默认值代替 - 字符串键区分大小写:
x['title'].lower()能实现忽略大小写的排序 - 多级排序可嵌套元组:
key=lambda x: (x['status'], -x['priority']),后者加负号实现降序
用 list.sort() 原地排序并控制升/降序
如果想直接修改原列表、节省内存,用 list.sort() 更合适。它只作用于列表本身,且必须是列表类型(不能用于元组或其它可迭代对象)。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
- 升序:
data.sort(key=lambda x: x['score']) - 降序:
data.sort(key=lambda x: x['score'], reverse=True) - 注意:若键值类型混杂(比如有的
'score'是None,有的是int),会抛出TypeError: ' - 安全做法是统一兜底:
key=lambda x: x.get('score', float('-inf'))(升序时让缺失排最前)或float('-inf')/float('inf')根据需求调整
处理嵌套键或带点号的路径(如 'user.profile.age')
标准 lambda 不支持点号路径访问,需手动拆解或借助工具函数。直接写 x['user']['profile']['age'] 容易因某层为 None 或缺失键而报错。
- 简单健壮写法:
lambda x: x.get('user', {}).get('profile', {}).get('age', 0) - 更通用可复用的方式是写个辅助函数:
def deep_get(d, path, default=None): keys = path.split('.') for k in keys: if isinstance(d, dict) and k in d: d = d[k] else: return default return d然后用key=lambda x: deep_get(x, 'user.profile.age', 0) - 第三方库如
dicttoxml或glom能简化这事,但纯 Python 场景下没必要引入依赖
性能差异和不可哈希键的陷阱
排序本身是 O(n log n),但 key 函数的执行次数是 O(n),所以 key 内部逻辑越轻量越好。尤其要避开在 key 里做 I/O、网络请求或复杂计算。
- 避免写成:
key=lambda x: expensive_function(x['id'])—— 会调用 n×log n 次 - 如果键值本身不可比较(比如字典、列表),
sorted()会直接报TypeError;确保目标键的值类型支持比较操作(int、str、datetime等) - 时间字段推荐转为
datetime对象再排序,而不是字符串格式的'2023-01-01'—— 否则按字典序排可能出错(例如'2023-12-01'会排在'2023-2-01'前面)
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










