2013-05-21 11 views
6

Sto cercando di fare una funzione che stampa la varianza di una lista di numeri definiti:Python: varianza di una lista di numeri definiti

grades = [100, 100, 90, 40, 80, 100, 85, 70, 90, 65, 90, 85, 50.5] 

Finora, ho cercato di procedere a fare queste tre funzioni:

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) 

Quando provo ad eseguire il codice, tuttavia, mi dà il seguente errore al seguente riga:

Line: variance += (average - my_list[i]) ** 2 
Error: list index out of range 

Mi scuso se le mie attuali conoscenze di Python sono limitate, ma sto ancora imparando - quindi per favore se vuoi aiutare a risolvere questo problema cerca di non suggerire modi estremamente complicati su come risolvere questo problema, grazie mille.

+2

Proprio come una nota, [ 'sum()'] (http://docs.python.org/3.3/library/functions.html#sum) è una funzione built-in che esiste già - senza necessità di reinventare la ruota. 'sum (gradi)' farà. –

+0

Questo è corretto. – GiamPy

risposta

7

Per prima cosa suggerirei di utilizzare il metodointegrato di Python per sostituire il primo metodo personalizzato. grades_average diventa allora:

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

In secondo luogo, vi consiglio vivamente esaminando la NumPy library, in quanto ha questi metodi built-in. numpy.mean() e numpy.std() coprirebbero entrambi questi casi.

Se sei interessato a scrivere il codice per te stesso per primo, va benissimo anche questo. Per quanto riguarda il tuo errore specifico, credo che @gnibbler l'abbia inchiodato sopra. Se si desidera ciclo utilizzando un indice, è possibile ristrutturare la linea in grades_variance essere:

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

Come Lattyware notato, loop da indice non è particolarmente "Pythonic"; il modo in cui lo stai facendo è generalmente superiore. Questo è solo per riferimento.

+1

Vale la pena notare che il ciclo per indice è una pessima idea in Python - è più difficile da leggere, più lento e rende il tuo codice inflessibile. –

+0

D'accordo, ma è utile sapere come fare. – Magsol

+0

Cosa intendi con "il modo in cui attualmente lo faccio è generalmente superiore"? – GiamPy

6

Quando si dice

for i in my_list: 

i non è l'indicedella voce. iè la voce

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

Grazie, è stato un errore così stupido. – GiamPy

5

Mentre gnibbler has solved the problem with your code, si può raggiungere questo molto più facilmente usando built-in functions e un generator expression:

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

Potrebbe sembrare un po 'paura in un primo momento, ma se si guarda il video Link alle comprensioni delle liste e alle espressioni del generatore: sono in realtà molto semplici e utili.

+0

Nota che vuoi 2.0 se sei su python 2.x – boxed

16

Prova numpy.

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

python 3.4 ha una statistica lib che lo fa.

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

Mi piacerebbe solo vedere una porta 'statistiche' su python 2.7 –

+0

@ThiagoFernandes Oggi è il tuo giorno fortunato https://pypi.python.org/pypi/statistics – zengr

+1

Wow, congratulazioni !! ; D Davvero grazie, sarà d'aiuto! –

-1

il codice di seguito viene utilizzato per ottenere la media dei valori

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

varianza formula -> La media dei quadrati delle differenze dalla media. Questo codice di seguito viene utilizzata per ottenere la varianza dei valori

def grades_variance(my_list, average): 
    variance = 0 
    for i in my_list: 
     variance += (average - i) ** 2 
    return variance/len(my_list) 
0

Suppongo che si desidera che il campione di varianza vale a dire l'stimatore della varianza. Penso che questa funzione potrebbe fare il lavoro. Stamperà la varianza e la media di un vettore 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) 
Problemi correlati