如何移除列表中的重复key并计算相同key对应值的平均值
解决按相同Key计算平均值的问题
嘿,这个需求很常见,我来给你几种实用的Python实现方案,都能完美满足你的需求~
方法1:手动使用字典统计(最直观)
核心思路是用字典记录每个Key对应的数值总和与出现次数,最后计算平均值,逻辑清晰易懂:
input_list = [[('a', 'b'), 1], [('b', 'c'), 2], [('a', 'b'), 5]] sum_count = {} # 遍历输入列表,统计总和与计数 for key, value in input_list: if key in sum_count: sum_count[key][0] += value sum_count[key][1] += 1 else: # 首次出现时,初始化总和为当前值,计数为1 sum_count[key] = [value, 1] # 转换为期望的输出格式 output_list = [[key, total / count] for key, (total, count) in sum_count.items()] print(output_list) # 输出: [[('a', 'b'), 3.0], [('b', 'c'), 2.0]]
如果需要整数结果(比如示例里的3而非3.0),可以把除法换成整数除法:total // count。
方法2:用collections.defaultdict简化代码
借助Python标准库的defaultdict,可以省去判断Key是否存在的逻辑,让代码更简洁:
from collections import defaultdict input_list = [[('a', 'b'), 1], [('b', 'c'), 2], [('a', 'b'), 5]] # 给不存在的Key默认分配[总和, 计数]的初始值[0, 0] sum_count = defaultdict(lambda: [0, 0]) for key, value in input_list: sum_count[key][0] += value sum_count[key][1] += 1 output_list = [[key, total / count] for key, (total, count) in sum_count.items()] print(output_list)
方法3:用itertools.groupby(适合有序输入)
如果你的输入列表已经按Key排序,或者可以接受先排序,groupby会是个很优雅的选择:
from itertools import groupby input_list = [[('a', 'b'), 1], [('b', 'c'), 2], [('a', 'b'), 5]] # 注意:groupby需要先按Key排序,否则相同Key的元素不连续会被分成不同组 sorted_list = sorted(input_list, key=lambda x: x[0]) output_list = [] for key, group in groupby(sorted_list, key=lambda x: x[0]): # 提取当前组内的所有数值 values = [item[1] for item in group] avg = sum(values) / len(values) output_list.append([key, avg]) print(output_list)
方案对比
- 字典类方法(方法1、2):时间复杂度O(n),无需排序,效率更高,适合大多数场景;
groupby方法:时间复杂度O(n log n)(因需要排序),但代码风格更函数式,适合已经有序的输入。
内容的提问来源于stack exchange,提问作者Sorin Zaharia
相关产品推荐
相关产品推荐

