如何从字典列表中按名称保留对应最高数值的字典(去除同名称低数值重复项)
如何从字典列表中按名称保留对应最高数值的字典(去除同名称低数值重复项)
看起来你现在的代码思路有点走偏啦——你把所有name和value分别收集到了一起,最后取的是所有name字符串里的最大值('y'确实比'x'大)和所有value里的最大值,这当然没法得到按名称分组保留对应最大数值的字典列表啦。
问题核心
我们需要按name分组,每个组里只留下value最大的那个完整字典,而不是把name和value拆分开独立处理。
解法一:高效遍历法(推荐)
直接遍历列表,用字典记录每个name对应的最大value字典,逻辑简单且时间复杂度为O(n),适合处理大规模数据:
input_list = [{'name': 'x', 'value': 0.6479667110413355}, {'name': 'x', 'value': 1.0}, {'name': 'y', 'value': 0.9413355}, {'name': 'y', 'value': 0.9}] # 用name作为键,保存每个name对应的最大value字典 max_dict = {} for item in input_list: name = item['name'] # 如果name未记录,或当前item的value更大,就更新记录 if name not in max_dict or item['value'] > max_dict[name]['value']: max_dict[name] = item # 把字典的值转为列表,就是目标结果 result = list(max_dict.values()) print(result)
运行输出:
[{'name': 'x', 'value': 1.0}, {'name': 'y', 'value': 0.9413355}]
解法二:使用itertools.groupby
如果喜欢用工具函数,可以用groupby实现,但要注意先按name排序(因为groupby只会对连续相同的元素分组):
from itertools import groupby # 先按name排序,确保同name的元素连续排列 sorted_list = sorted(input_list, key=lambda x: x['name']) result = [] for name, group in groupby(sorted_list, key=lambda x: x['name']): # 在每个分组中筛选出value最大的字典 max_item = max(group, key=lambda x: x['value']) result.append(max_item) print(result)
这个方法也能得到相同结果,但排序会带来额外的时间开销,适合对代码简洁性要求更高的场景。
备注:内容来源于stack exchange,提问作者anshuk_pal
相关产品推荐
相关产品推荐

