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
相关产品推荐
相关产品推荐

