我正在尝试创建一个打印已定义数字列表的方差的函数:
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知识有限,但我仍在学习 - 所以如果你想帮助解决这个问题,请尽量不要提出如何解决这个问题的极其复杂的方法,非常感谢你。
答案 0 :(得分:18)
尝试numpy。
import numpy as np
variance = np.var(grades)
答案 1 :(得分:11)
首先,我建议使用Python的内置sum
方法来替换您的第一个自定义方法。 grades_average
然后成为:
def grades_average(my_list):
sum_of_grades = sum(my_list)
average = sum_of_grades / len(my_list)
return average
其次,我强烈建议您查看NumPy library,因为它内置了这些方法。 numpy.mean()
和numpy.std()
将涵盖这两种情况。
如果您有兴趣首先为自己编写代码,那也完全没问题。至于你的具体错误,我相信上面的@gnibbler钉了它。如果要使用索引循环,可以将grades_variance
中的行重构为:
for i in range(0, len(my_list)):
正如Lattyware所指出的那样,按索引循环不是特别“Pythonic”;你目前正在做的方式通常是优越的。这仅供您参考。
答案 2 :(得分:6)
当你说
时 for i in my_list:
i
不是该项目的索引。 i
项目
for i in my_list:
variance += (average - i) ** 2
答案 3 :(得分:5)
gnibbler has solved the problem with your code built-in functions,您可以使用generator expression和{{3}}更轻松地实现这一目标:
average = sum(grades) / len(grades)
varience = sum((average - value) ** 2 for value in grades) / len(grades)
一开始可能看起来有点吓人,但如果你观看关于列表推导和生成器表达式的视频 - 它们实际上非常简单实用。
答案 4 :(得分:4)
python 3.4有一个统计库,可以做到这一点。
import statistics
grades = [100, 100, 90, 40, 80, 100, 85, 70, 90, 65, 90, 85, 50.5]
statistics.pvariance(grades)
=> 334.07100591715977
https://docs.python.org/3/library/statistics.html#statistics.pvariance
答案 5 :(得分:0)
我想你想要样本方差,即方差的无偏估计。我认为这个功能可能会起作用。它将打印方差和向量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)
答案 6 :(得分:0)
下面的代码用于获取我创建的自定义函数的差异
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)
答案 7 :(得分:-1)
以下代码用于获取值的平均值
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)