查找列表及其子列表的平均值的问题

时间:2014-11-26 15:01:32

标签: python numbers

当我使用正数和负数混合时,我似乎无法弄清楚为什么我在下面的代码中的平均值是错误的。 非常感谢任何帮助,提前谢谢。

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)    

4 个答案:

答案 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,否则如果列表ZeroDivisionErrorpos中的任何一个为空,则上述代码可能会引发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()
相关问题