Python 中如何按字典的某个值对字典列表排序?
对字典列表按某个键的值排序:sorted(list, key=lambda x: x['age']);倒序加 reverse=True;itemgetter 可替代简单取键,性能需实测。本文介绍各种排序写法。
用 sorted() 加 key 函数:sorted(my_list, key=lambda x: x['age']) 按 age 升序;reverse=True 变降序;operator.itemgetter('age') 是适用于键访问的另一种写法,速度需实测。
基本用法
users = [
{'name': '张三', 'age': 28},
{'name': '李四', 'age': 22},
{'name': '王五', 'age': 35},
]
# 按 age 升序
sorted_users = sorted(users, key=lambda x: x['age'])
# 按 age 降序
sorted_users = sorted(users, key=lambda x: x['age'], reverse=True)
sorted() 返回新列表,原列表顺序不变,但其中字典仍是同一批对象,并非深复制;想原地排序用 my_list.sort(key=...)。
itemgetter
from operator import itemgetter
sorted_users = sorted(users, key=itemgetter('age'))
多字段排序
# 先按 age 降序,再按 name 升序
sorted(users, key=lambda x: (-x['age'], x['name']))
处理缺失键
某些字典可能没有目标键,直接访问会 KeyError:
sorted(users, key=lambda x: x.get('age', 0)) # 仅缺失键按 0;已有 age=None 不会替换为0
常见问题(FAQ)
Q:排序稳定吗?
A:Python 的排序是稳定的——值相同的元素保持原有相对顺序,所以多字段排序也可以分多次单字段排序实现(先排次要字段再排主要字段)。
Q:日期字符串能直接排吗?
A:ISO 格式(YYYY-MM-DD)字符串的字典序与时间序一致,可以直接排;其他格式需要先转成 datetime。
Q:值类型不一致(有 int 有 str)会怎样?
A:无法互相排序的类型(如 int 与 str 或 None)会抛 TypeError;int/float 等可比较组合并非一概禁止。先统一类型或在 key 函数里转换。