Python: дисперсия списка определенных чисел

Я пытаюсь сделать функцию, которая печатает дисперсию списка определенных чисел:

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 ограничены, но я все еще учусь - поэтому, пожалуйста, если вы хотите помочь решить эту проблему, попробуйте не предлагать чрезвычайно сложные способы решения этой проблемы, большое спасибо.

7 ответов


сначала я бы предложил использовать встроенный Python sum метод для замены первого пользовательского метода. будет:

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

во-вторых, я настоятельно рекомендую посмотреть в библиотека NumPy, поскольку он имеет эти встроенные методы. numpy.mean() и numpy.std() будет охватывать оба этих случая.

если вы заинтересованы в написании кода для себя в первую очередь, это тоже прекрасно. Что касается вашей конкретной ошибки, я считаю, что @gnibbler выше прибил ее. Если вы хотите выполнить цикл с использованием индекса, вы можете реструктурировать строку в grades_variance для:

for i in range(0, len(my_list)):

As Lattyware отметил, циклы по индексу не особо "весть"; как вы сейчас делаете это обычно. Это только для справки.


попробовать включает в себя.

import numpy as np
variance = np.var(grades)

когда вы говорите

 for i in my_list:

i не индекс элемента. i is элемент

for i in my_list:
    variance += (average - i) ** 2

While gnibbler решил проблему с вашим кодом, вы можете достичь этого гораздо проще, используя встроенные функции и a выражение генератор:

average = sum(grades) / len(grades)
varience = sum((average - value) ** 2 for value in grades) / len(grades)

сначала это может показаться немного страшным, но если вы посмотрите видео, которое я ссылаюсь на список и выражения генератора - они на самом деле очень просты и полезны.


python 3.4 имеет статистику lib, которая делает это.

   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


Я полагаю, вы хотели бы выборочную дисперсию, т. е. несмещенная оценка дисперсии. Думаю, эта функция справится. Он будет печатать дисперсию и среднее значение вектора 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 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)