
本文介绍一种高效、简洁的方法,从包含重复键(如'name')的字典列表中,仅保留每个键对应最大'value'值的字典,适用于数据清洗与聚合场景。
本文介绍一种高效、简洁的方法,从包含重复键(如'name')的字典列表中,仅保留每个键对应最大'value'值的字典,适用于数据清洗与聚合场景。
在实际数据处理中,我们常遇到一类需求:给定一个由字典组成的列表,其中多个字典可能具有相同的标识字段(例如 'name'),但其他字段(如 'value')不同;此时需按该标识字段分组,并保留每组中 'value' 最大的那条记录,从而实现“去重保优”。
最直观且推荐的解法是利用 Python 字典的键唯一性 + 插入覆盖特性,配合排序预处理:先按 'value' 升序排序,再用字典推导式构建 {name: dict} 映射——由于相同 name 后出现的字典会自动覆盖先前的,因此最终每个 name 对应的就是其最大 value 的字典。
以下是完整可运行示例:
from operator import itemgetter
input_list = [
{'name': 'x', 'value': 0.6479667110413355},
{'name': 'x', 'value': 1.0},
{'name': 'y', 'value': 0.9413355},
{'name': 'y', 'value': 0.9}
]
# 关键步骤:按'value'升序排序 → 构建name→dict映射 → 取values()
result = list({d['name']: d for d in sorted(input_list, key=itemgetter('value'))}.values())
print(result)
# 输出: [{'name': 'x', 'value': 1.0}, {'name': 'y', 'value': 0.9413355}]✅ 原理说明:
-
sorted(..., key=itemgetter('value'))确保较小的value先被处理,较大的后处理; - 字典推导式
{d['name']: d ...}中,相同name的后续条目会覆盖前面的,因此最终保留的是value最大的那个; -
.values()提取所有保留的字典,list()转为列表。
⚠️ 注意事项:
- 若需严格降序保留最大值,也可改用
reverse=True并保持逻辑不变(即先排降序,再用字典覆盖——但此时第一个出现的就是最大值,覆盖行为反而冗余;升序更符合“后胜”直觉); - 此方法要求
'name'字段始终存在且为可哈希类型(如字符串、数字),否则会抛出KeyError或TypeError; - 若原始列表极大,且内存敏感,可考虑使用
itertools.groupby配合max()实现流式分组,但代码复杂度显著上升,一般场景不必要。
该方案简洁、可读性强、时间复杂度为 O(n log n)(主要开销在排序),是处理此类“分组取极值”问题的 Pythonic 范式。

















