首页 文章

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

提问于
浏览
-1

我有一个列表,我想计算它的平均值 . 获得平均值后,我想从列表中减去每个项目的平均值 . 获得所有值后,我想要平方和总和 .

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)

Error Message

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

所需的输出为42.4

5 回答

  • 0

    你的错误在这里:

    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)
    
  • 0

    您可以使用 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)
    
  • 0

    我尝试你的问题,尽管它没有像我已经想到的其他答案那么精细,但它基本上是一步一步的: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])
    
  • 0

    您可以使用 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次方差,它应该等于你想要的 .

  • 0

    基本上你想要计算列表 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)
    

相关问题