Python中如何合并列表内重复字典并保留高conf值条目
更简洁的实现:按name去重并保留最高conf值
你的需求是从包含重复name的字典列表中,为每个name保留conf值最高的条目,这里有两种更高效简洁的实现方式:
方法一:利用字典的键唯一性(最优高效)
字典的键天然具有唯一性,我们可以用name作为键,直接存储对应最大的conf值,最后再转回列表格式:
lst = [ {'name': 'bezel', 'conf': 0.67}, {'name': 'plate', 'conf': 0.69}, {'name': 'bezel', 'conf': 0.65}, {'name': 'plate', 'conf': 0.46}, {'name': 'bezel', 'conf': 0.42} ] # 初始化字典存储每个name的最大conf max_conf_map = {} for item in lst: name = item['name'] current_conf = item['conf'] # 若name未记录,或当前conf更大则更新 if name not in max_conf_map or current_conf > max_conf_map[name]: max_conf_map[name] = current_conf # 转换为目标列表格式 result = [{'name': name, 'conf': conf} for name, conf in max_conf_map.items()] print(result)
这种方法的时间复杂度是O(n),只需要遍历一次原列表,比你当前的多层循环(O(n²))效率高很多,尤其适合数据量大的场景。
方法二:使用itertools.groupby(代码简洁)
如果可以接受先排序的开销,用groupby分组后取每组最大值也很直观:
from itertools import groupby lst = [ {'name': 'bezel', 'conf': 0.67}, {'name': 'plate', 'conf': 0.69}, {'name': 'bezel', 'conf': 0.65}, {'name': 'plate', 'conf': 0.46}, {'name': 'bezel', 'conf': 0.42} ] # 先按name排序,确保同name元素被分到一组 sorted_list = sorted(lst, key=lambda x: x['name']) result = [] # 按name分组,每组取conf最大的元素 for name, group in groupby(sorted_list, key=lambda x: x['name']): max_item = max(group, key=lambda x: x['conf']) result.append(max_item) print(result)
这个方法的时间复杂度由排序决定,是O(n log n),代码结构清晰,适合对性能要求不是极致但追求可读性的场景。
对比你的现有实现
你当前的代码需要反复遍历新列表检查元素、查找索引,当列表元素较多时,重复的查找操作会导致效率明显下降。上面两种方法都避免了这种冗余操作,代码更简洁易维护。
内容的提问来源于stack exchange,提问作者S Andrew
相关产品推荐
相关产品推荐

