2013-05-21 6 views
6

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

+2

Так же, как примечание, [ '(сумма)'] (http://docs.python.org/3.3/library/functions.html#sum) является встроенной функцией, которая уже существует - нет нужно изобретать велосипед. 'sum (grades)' будет делать. –

+0

Это правильно. – GiamPy

ответ

7

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

+1

Стоит отметить, что цикл с индексом - ужасная идея в Python - сложнее читать, медленнее и делает ваш код негибким. –

+0

Согласен, но полезно знать, как это сделать. – Magsol

+0

Что вы подразумеваете под «способом, которым я сейчас занимаюсь, как правило, лучше»? – GiamPy

6

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

for i in my_list: 

i не индекс элемента. iявляется деталь

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

Спасибо, это была такая глупая ошибка. – GiamPy

5

Хотя gnibbler has solved the problem with your code, вы можете добиться этого гораздо легче с помощью built-in functions и generator expression:

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

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

+0

Обратите внимание, что вам нужно 2.0, если вы находитесь на python 2.x – boxed

4

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

+0

Мне просто хотелось бы увидеть порт 'статистика' на python 2.7 –

+0

@ThiagoFernandes Сегодня ваш счастливый день https://pypi.python.org/pypi/statistics – zengr

+1

Ничего себе, поздравляю !! ; D Действительно спасибо, это будет полезно! –

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