为数字列表编写自定义求和函数



我有一个列表,我想计算它的平均值。在得到平均值后,我想用平均值减去列表中的每个项目。在得到所有的值之后,我想平方并求和。

x=[17,13,12,15,16,14,16,16,18,19]
Average is 15.6
For example list look like: x=[17,13,12,15,16,14,16,16,18,19]

步骤1:

Find average value
sum(x)/len(x) 
average value is 15.6

第2步:用平均值从列表中减去每个项目

17-15.6  =  1.4
13-15.6  = -2.6
12-15.6  = -3.6
15-15.6  = -0.6
16-15.6  =  0.4
14-15.6  = -1.6
16-15.6  =  0.4
16-15.6  =  0.4
18-15.6  =  2.4
19-15.6  =  3.4

步骤3:之后,我想应用每个结果的平方

1.4   * 1.4    = 1.96
-2.6  * -2.6   = 6.76
-3.6  * -3.6   = 12.96
-0.6  * -0.6   = 0.36
0.4   * 0.4    = 0.16
-1.6  * -1.6   = 2.56
0.4   * 0.4    = 0.16
0.4   * 0.4    = 0.16
2.4   * 2.4    = 5.76
3.4   * 3.4    = 11.56

第4步:之后我想求平方和

1.96 + 6.76 + 12.96 0.36 +0.16 + 2.56 + 0.16 + 0.16 + 5.76 + 11.56 = 42.4

我尝试了这种方法,我能够达到步骤3

def sumx(x):
for i in x:                        #
result=i-sum(x)/len(x)         #
result=result*result           #
#result="{:.2f}".format(result)
print("{:.2f}".format(result))
total=0
for i in result:
total +=i
return (total)
sumx(x)

错误消息

结果中i的错误消息:TypeError:"float"对象不是可迭代

所需输出为42.4

您的错误在这里:

total=0
for i in result:
total +=i

这里的结果只是一个数字,而不是一个列表。因此,整个代码都写错了。

相反,您可以在函数的起始位置初始化total,并去掉for循环。

这里有一个简单的代码:

x = [17,13,12,15,16,14,16,16,18,19]
average = sum (x) / float (len (x))
total = 0
for number in x:
result = pow ((number - average), 2)
total += result
print total

如果你想把它作为一个功能:

x = [17,13,12,15,16,14,16,16,18,19]
def sumx(x):
average = sum (x) / float (len (x))
total = 0
for i in x:                        
result = i - average
result = result * result           
total += result
return (total)
print sumx(x)

基本上,您想要计算列表x的均值和方差。

x = [17, 13, 12, 15, 16, 14, 16, 16, 18, 19]
n = len(x)
mean = sum(x) / n
var = sum((t - mean)**2 for t in x) / n

如果只需要平方和,请在计算var时删除除以n

因此,如果你只想返回平方和:

def ssq(x):
mean = sum(x) / len(x)
return sum((t - mean)**2 for t in x)

您可以使用numpy和列表理解:

import numpy as np
x=[17,13,12,15,16,14,16,16,18,19]
# using mean function from numpy
sum((y - np.mean(x))**2 for y in x) # 42.4
# calculating mean on our own (pure python)
sum((y - (sum(x)/float(len(x))))**2 for y in x) # 42.4
# function to calculate sse
def sse(x):
m = np.mean(x)
return sum((y - m)**2 for y in x)

您可以使用numpy并矢量化计算:

import numpy as np
x = np.array([17,13,12,15,16,14,16,16,18,19])
normalized_vector = x - np.mean(x)
result = np.dot(normalized_vector, normalized_vector)

因为点积等于元素的平方和。更简洁地说:

result = np.var(x) * x.size

它计算n乘以方差,这应该等于你想要的。

我试图回答你的问题,尽管它不像我所想的其他答案那样详细,但它基本上是循序渐进的:D

import numpy as np
def std(x = [], to = None):
if to is None:
to = []
to.append(x)
y = np.mean(to)
z = []
for item in to:
z.append((item - y)**2)
print(sum(z[0]))
std([17,13,12,15,16,14,16,16,18,19])

最新更新