Python:定义的数字列表的方差

Python:定义的数字列表的方差,python,list,numbers,variance,defined,Python,List,Numbers,Variance,Defined,我正在尝试制作一个函数,用于打印已定义数字列表的方差: grades = [100, 100, 90, 40, 80, 100, 85, 70, 90, 65, 90, 85, 50.5] 到目前为止,我已经尝试了实现这三个功能: def grades_sum(my_list): total = 0 for grade in my_list: total += grade return total def grades_average(my_list

我正在尝试制作一个函数,用于打印已定义数字列表的方差:

grades = [100, 100, 90, 40, 80, 100, 85, 70, 90, 65, 90, 85, 50.5]
到目前为止,我已经尝试了实现这三个功能:

def grades_sum(my_list):
    total = 0
    for grade in my_list: 
        total += grade
    return total

def grades_average(my_list):
    sum_of_grades = grades_sum(my_list)
    average = sum_of_grades / len(my_list)
    return average

def grades_variance(my_list, average):
    variance = 0
    for i in my_list:
        variance += (average - my_list[i]) ** 2
    return variance / len(my_list)
但是,当我尝试执行代码时,它在下面一行给出了以下错误:

Line: variance += (average - my_list[i]) ** 2
Error: list index out of range
如果我目前的Python知识有限,我深表歉意,但我仍在学习中-因此,如果您希望帮助解决此问题,请尝试不要建议如何解决此问题的极其复杂的方法,非常感谢

当你说

 for i in my_list:
i
不是该项的索引<代码>i是项目

同时,您可以更轻松地使用和:


一开始可能看起来有点吓人,但如果你看我链接的关于列表理解和生成器表达式的视频,它们实际上非常简单和有用。

首先,我建议使用Python内置的
sum
方法来取代你的第一个自定义方法<代码>等级\u平均值然后变为:

def grades_average(my_list):
    sum_of_grades = sum(my_list)
    average = sum_of_grades / len(my_list)
    return average
第二,我强烈建议研究,因为它内置了这些方法
numpy.mean()
numpy.std()
将涵盖这两种情况

如果您想先为自己编写代码,那也没关系。至于你的具体错误,我相信上面的@gnibler已经解决了。如果要使用索引循环,可以将
grades\u variance
中的行重新构造为:

for i in range(0, len(my_list)):
如前所述,索引循环并不是特别“Pythonic”;你目前做这件事的方式通常是优越的。这只是供您参考。

试试看


Python3.4有一个统计库来实现这一点

   import statistics
   grades = [100, 100, 90, 40, 80, 100, 85, 70, 90, 65, 90, 85, 50.5]
   statistics.pvariance(grades)
=> 334.07100591715977

下面的代码用于获取值的平均值

def grades_average(my_list):
    sum_of_grades = sum(my_list)
    average = sum(my_list) / len(my_list)
    return average
def grades_variance(my_list, average):
    variance = 0
    for i in my_list:
         variance += (average - i) ** 2
    return variance / len(my_list)
方差公式->平均值的平方差的平均值。 下面的代码用于获取值的方差

def grades_average(my_list):
    sum_of_grades = sum(my_list)
    average = sum(my_list) / len(my_list)
    return average
def grades_variance(my_list, average):
    variance = 0
    for i in my_list:
         variance += (average - i) ** 2
    return variance / len(my_list)

我想你需要样本方差,即方差的无偏估计量。我认为这个功能可以完成这项工作。它将打印向量n的方差和平均值

n = [5, 3, 1, 2, 4]

def variance1337(n):
    var1 = []
    mean1 = sum(n)/len(n)
    for xs in n:
        var1.append((xs - mean1) ** 2)
    print(sum(var1)/(len(n) - 1))
    print(mean1)

下面的代码用于获取方差,我创建了一个自定义函数

   def variance(val):
       total_sum=sum(val)
       average=total_sum/len(val)
       a=[]
       for i in val:
           a.append((i-average)**2)
       return sum(a)/len(a)

   val=[2.18,2.22,2.24,1.62,1.32,1.85,1.85,2.70,3.60,4.60,1.38,2.34,2.71]
   variance(val)

值得注意的是,它是一个已经存在的内置功能,无需重新发明轮子
sum(grades)
就可以了。值得注意的是,在Python中,按索引循环是一个糟糕的想法-它更难阅读,速度更慢,并且使您的代码变得不灵活。同意,但知道如何做很有用。您所说的“我目前做的方式通常更优越”是什么意思?您当前的循环结构使
I
成为列表中的一项。我给出了循环结构,使
I
成为列表中的整数索引。前者(在最初的问题中是如何做到的)通常更好。不需要加载NUMPY来计算一个方差。注意,如果你在Python 2.XI上想要2,只会喜欢看<代码>统计< /COD>端口到Python 2.7WOW,恭喜!D真的很感谢,那会很有帮助的!
   def variance(val):
       total_sum=sum(val)
       average=total_sum/len(val)
       a=[]
       for i in val:
           a.append((i-average)**2)
       return sum(a)/len(a)

   val=[2.18,2.22,2.24,1.62,1.32,1.85,1.85,2.70,3.60,4.60,1.38,2.34,2.71]
   variance(val)