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 处理
常见问题(FAQ)
Q:排序稳定吗?
A:Python 的排序是稳定的——值相同的元素保持原有相对顺序,所以多字段排序也可以分多次单字段排序实现(先排次要字段再排主要字段)。
Q:日期字符串能直接排吗?
A:ISO 格式(YYYY-MM-DD)字符串的字典序与时间序一致,可以直接排;其他格式需要先转成 datetime。
Q:值类型不一致(有 int 有 str)会怎样?
A:Python 3 中混合类型比较会抛 TypeError。先统一类型或在 key 函数里转换。