J'essaie de créer une fonction qui affiche la variance d'une liste de nombres définis:
grades = [100, 100, 90, 40, 80, 100, 85, 70, 90, 65, 90, 85, 50.5]
Jusqu'à présent, j'ai essayé de procéder à la création de ces trois fonctions:
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)
Cependant, lorsque j'essaie d'exécuter le code, l'erreur suivante apparaît à la ligne suivante:
Line: variance += (average - my_list[i]) ** 2
Error: list index out of range
Toutes mes excuses si mes connaissances actuelles en Python sont limitées, mais je suis toujours en train d’apprendre. Je vous en prie, si vous souhaitez aider à résoudre ce problème, essayez de ne pas suggérer de méthodes extrêmement compliquées pour le résoudre. Merci beaucoup.
Tout d'abord, je suggérerais d'utiliser la méthode sum
intégrée de Python pour remplacer votre première méthode personnalisée. grades_average
devient alors:
def grades_average(my_list):
sum_of_grades = sum(my_list)
average = sum_of_grades / len(my_list)
return average
Deuxièmement, je recommanderais vivement de regarder dans la bibliothèque NumPy , car ces méthodes sont intégrées. numpy.mean()
et numpy.std()
couvriraient ces deux cas.
Si vous souhaitez d'abord écrire le code pour vous-même, c'est très bien aussi. En ce qui concerne votre erreur spécifique, je crois que @gnibbler ci-dessus l’a cloué. Si vous voulez utiliser un index en boucle, vous pouvez restructurer la ligne dans grades_variance
pour qu'elle soit:
for i in range(0, len(my_list)):
Comme Lattyware noté, la boucle par index n'est pas particulièrement "Pythonic"; la façon dont vous le faites actuellement est généralement supérieure. Ceci est juste pour votre référence.
Essayez numpy .
import numpy as np
variance = np.var(grades)
Quand tu dis
for i in my_list:
i
n'est pas le index de l'élément. i
is l'élément
for i in my_list:
variance += (average - i) ** 2
Bien que gnibbler ait résolu le problème avec votre code , vous pouvez y parvenir beaucoup plus facilement en utilisant fonctions intégrées et un expression génératrice :
average = sum(grades) / len(grades)
varience = sum((average - value) ** 2 for value in grades) / len(grades)
Cela peut paraître un peu effrayant au début, mais si vous regardez la vidéo, vous trouverez un lien vers la compréhension des listes et les expressions de générateur - elles sont en réalité très simples et utiles.
python 3.4 a une bibliothèque de statistiques qui le fait.
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
Je suppose que vous souhaiteriez la variance de l’échantillon, c’est-à-dire l’estimateur sans biais de la variance. Je pense que cette fonction pourrait faire le travail. Il imprimera la variance et la moyenne d'un vecteur 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)