
本文介绍一种简洁高效的方法,通过排序 + 字典推导式,从含重复 name 键的字典列表中筛选出每个 name 对应 value 最大的唯一字典。
本文介绍一种简洁高效的方法,通过排序 + 字典推导式,从含重复 name 键的字典列表中筛选出每个 name 对应 value 最大的唯一字典。
在数据处理中,常遇到一类需求:给定一个由字典组成的列表,其中多个字典可能具有相同的 'name' 键(如标识符),但 'value' 值不同;目标是对每个唯一 name,仅保留 value 最大的那一条记录,其余重复项剔除。
直接使用 defaultdict 或简单遍历容易逻辑错位(如原代码中误将所有键统一归并,导致 name 和 value 混淆),而更稳健的思路是:先按 value 升序排序,再用字典推导式以 name 为键逐个覆盖——因升序排列,后出现的同名项 value 更大,自然保留最大值;若需降序,则改用 reverse=True 并保持覆盖顺序一致即可。
以下是推荐实现(兼容 Python 3.7+,利用字典插入顺序与 key 唯一性):
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 会被更大 value 覆盖
sorted_list = sorted(input_list, key=itemgetter('value'))
# 构建 {name: dict} 映射,自动去重(同 name 只保留最后出现的,即 value 最大者)
result_dict = {d['name']: d for d in sorted_list}
# 转回列表(Python 3.7+ 保证插入顺序,故结果按 value 升序排列;如需原始 name 顺序或 value 降序,见下方说明)
result_list = list(result_dict.values())
print(result_list)
# 输出: [{'name': 'x', 'value': 1.0}, {'name': 'y', 'value': 0.9413355}]
✅ 关键原理说明:
-
sorted(..., key=itemgetter('value'))确保 value 小的排前面、大的排后面; -
{d['name']: d for d in sorted_list}利用字典 key 不可重复的特性,相同'name'的条目会不断被后续更高 value 的条目覆盖; - 最终
list(...)提取所有“胜出”的字典。
⚠️ 注意事项:
- 若需结果按
name字母序排列,可在最后加sorted(result_list, key=lambda x: x['name']); - 若原始列表极大(如 >10⁵ 条),可改用
itertools.groupby配合预排序提升可读性,但本方法时间复杂度 O(n log n),已足够高效; - 确保所有字典均含
'name'和'value'键,否则需增加异常处理(如try/except KeyError或使用dict.get('value', float('-inf')))。
该方案简洁、可读性强,无需第三方库,是处理此类“分组取极值”问题的 Pythonic 推荐解法。










