You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除列表中的重复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:12:30