Python列表范围平均值计算错误,求排查问题原因
排查Python列表切片平均值计算错误的原因
问题背景
现有两个列表v1和v2,需求如下:
- 筛选
v1中所有3的倍数,得到列表vm3 - 对
vm3中的每个元素i,取v2的前i个元素 - 计算该子列表的平均值、最小值和最大值
目前最小值与最大值计算正确,但平均值结果不符合预期:
- 当
i=3时,v2前3个元素总和为4+6+7=17,平均值应为17/3≈5.666,但代码输出6.666 - 当
i=6时,结果同样错误
原代码
v1 = [2,3,4,6,2] v2 = [4,6,7,4,9,3,4,5,5,45,5,4] vm3 = [] for i in v1: if i % 3 == 0: vm3.append(i) mayl = [] menl = [] proml = [] for i in vm3: may = v2[i-1] men = v2[i-1] prom = 0 for j in range(i): prom = prom + v2[j] if v2[j] > may: may = v2[j] elif v2[j] < men: men = v2[j] mayl.append(may) menl.append(men) proml.append(prom/i+1) print(mayl) print(menl) print(proml)
当前输出
[7, 9] [4, 3] [6.666666666666667, 6.5]
错误原因分析
问题出在平均值计算的代码行:
proml.append(prom/i+1)
Python中除法运算符/的优先级高于加法运算符+,所以这行代码实际执行的逻辑是:先计算总和prom除以i,再给结果加1。这完全不符合“总和除以元素个数i”的平均值计算逻辑。
以i=3为例:
- 正确计算:
17/3≈5.666 - 错误计算:
(17/3)+1≈5.666+1=6.666,与你看到的错误结果一致
修复后的代码
只需将平均值计算的代码行修改为直接用总和除以元素个数i:
v1 = [2,3,4,6,2] v2 = [4,6,7,4,9,3,4,5,5,45,5,4] vm3 = [] for i in v1: if i % 3 == 0: vm3.append(i) mayl = [] menl = [] proml = [] for i in vm3: may = v2[i-1] men = v2[i-1] prom = 0 for j in range(i): prom = prom + v2[j] if v2[j] > may: may = v2[j] elif v2[j] < men: men = v2[j] mayl.append(may) menl.append(men) proml.append(prom / i) # 修正此处,移除多余的+1 print(mayl) print(menl) print(proml)
修复后输出
[7, 9] [4, 3] [5.666666666666667, 5.5]
该结果完全符合预期:
i=3时,平均值为17/3≈5.666i=6时,v2前6个元素总和为4+6+7+4+9+3=33,平均值为33/6=5.5
内容的提问来源于stack exchange,提问作者VOZ ESTOICA
相关产品推荐
相关产品推荐

