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

Python实现相同key值聚合并计算对应数值平均值

相同key数值聚合求平均值实现方案

原代码逻辑错误点

  • 未处理循环结束后最后一组key的统计,最后一个key的平均值不会被写入结果字典
  • 切换key的分支中重复累加了起始位置的数值,导致总和计算偏大
  • 没有对结果按名称排序,输出顺序和要求不符
  • 强依赖同key数据连续排列的前提,一旦同key数据分散,计算结果完全错误

注:题目给出的打印示例中平均值为随机填写的演示值,实际运行代码会输出基于输入数据计算的真实平均值。

通用实现(不要求同key数据连续排列)

该写法兼容性最好,无论输入数据中同key是否连续排列都能得到正确结果:

def takeAvg(addressList):
    # 统计每个key对应的数值总和、出现次数
    stat = {}
    for name, price in addressList:
        if name not in stat:
            stat[name] = {"total": 0.0, "count": 0}
        stat[name]["total"] += float(price)
        stat[name]["count"] += 1
    # 计算平均值,按名称排序匹配输出要求
    resultDict = {}
    for name in sorted(stat.keys()):
        avg = stat[name]["total"] / stat[name]["count"]
        resultDict[name] = f"{avg:.2f}"
    return resultDict

# 待处理输入数据
data = [['Absard', 140000.0], ['Absard', 150000.0], ['Absard', 150000.0], ['Absard', 173333.3], ['Abuzar', 28333.3], ['Abuzar', 34000.0], ['Abuzar', 90500.0], ['Afsarieh', 37333.3], ['Afsarieh', 44333.3], ['Afsarieh', 51666.6], ['Afsarieh', 55000.0], ['Afsarieh', 80000.0], ['Afsarieh', 105000.0], ['Ahang', 26666.6], ['Ahang', 46666.6], ['Air force', 55000.0], ['Air force', 56333.3]]

# 生成结果字典
avg_result = takeAvg(data)

# 按指定格式打印
print("NAME        AVG.")
print("----------------------")
for name, avg_val in avg_result.items():
    print(f"{name:<12s}{avg_val}")

原逻辑修正版(仅适合同key连续排列的输入)

如果确定输入数据中相同key一定连续排列,可以基于原逻辑修正,内存占用更低:

def takeAvg(addressList):
    resultDict = {}
    if not addressList:
        return resultDict
    tot = 0.0
    startIndex = 0
    data_len = len(addressList)
    for inner_i in range(data_len):
        current_name = addressList[inner_i][0]
        start_name = addressList[startIndex][0]
        if current_name == start_name:
            tot += float(addressList[inner_i][1])
        else:
            # 计算上一组key的平均值
            avg = tot / (inner_i - startIndex)
            resultDict[start_name] = f"{avg:.2f}"
            # 重置统计值,当前元素为新组的第一个值
            tot = float(addressList[inner_i][1])
            startIndex = inner_i
    # 处理最后一组key的统计
    last_name = addressList[startIndex][0]
    last_avg = tot / (data_len - startIndex)
    resultDict[last_name] = f"{last_avg:.2f}"
    # 按key排序后返回
    return dict(sorted(resultDict.items()))

内容的提问来源于stack exchange,提问作者Alpovka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:06:26