当我使用正数和负数混合时,我似乎无法弄清楚为什么我在下面的代码中的平均值是错误的。 非常感谢任何帮助,提前谢谢。
my_num = []
while True:
n = input("Enter a number (-9999 to end):")
if n == '-9999':
break # if user enters -9999 it will come out of loop
my_num.append(int(n)) # adding the numbers with append function
avg = sum(my_num)/len(my_num) #using sum and len function to determine averages
avgpos = sum([ x for x in my_num if x>=0 ])/len(my_num)
avgneg = sum([ x for x in my_num if x<0 ])/len(my_num)
print("the list of all numbers entered are:")
print(my_num)
print("The dictionary with averages is:")
my_dict = {'AvgPositive': avgpos, 'AvgNonPos': avgneg, 'AvgAllNum': avg}
print(my_dict)
答案 0 :(得分:3)
你的平均值是错误的,因为你的分母在计算偏微分方面是错误的
avgpos = sum([ x for x in my_num if x>=0 ])/len(my_num)
avgneg = sum([ x for x in my_num if x<0 ])/len(my_num)
在上面,你得到了正确的总和,但长度不正确。
相反,请使用适当的长度
pos = [ x for x in my_num if x>=0 ]
neg = [ x for x in my_num if x<0 ]
avgpos = sum(pos)/len(pos) if len(pos) else None
avgneg = sum(neg)/len(neg) if len(neg) else None
请注意,我使用上面的ternary operator,否则如果列表ZeroDivisionError
或pos
中的任何一个为空,则上述代码可能会引发neg
(即,输入的所有数字均为正数,输入的所有数字均为负数时的情况。
答案 1 :(得分:1)
问题在于:
avgpos = sum([ x for x in my_num if x>=0 ])/len(my_num)
avgneg = sum([ x for x in my_num if x<0 ])/len(my_num)
你正在计算正/负数的集合,但是使用所有数字的集合来做到这一点!
尝试:
avgpos = sum([ x for x in my_num if x>=0 ])/len([ x for x in my_num if x>=0 ])
avgneg = sum([ x for x in my_num if x<0 ])/len([ x for x in my_num if x<0 ])
答案 2 :(得分:0)
让我向您介绍过滤器和lambda:
pos = filter(lambda x: x>=0 and x,my_num)
neg = filter(lambda x: x<0 and x,my_num)
avgpos = sum(pos)/len(pos)
avgneg = sum(neg)/len(neg)
答案 3 :(得分:0)
我认为最简单的方法是使用numpy:
import numpy as np
a = np.array(my_num)
avg = a.mean()
avg_pos = a[a > 0].mean()
avg_neg = a[a < 0].mean()