Je dois trouver la moyenne d'une liste en Python. C'est mon code jusqu'à présent
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
print reduce(lambda x, y: x + y, l)
Je l'ai donc il additionne les valeurs de la liste, mais je ne sais pas comment le diviser en elles?
sum(L) / float(len(L))
. gérer les listes vides dans le code de l'appelant commeif not L: ...
Réponses:
Sur Python 3.4+, vous pouvez utiliser
statistics.mean()
Sur les anciennes versions de Python, vous pouvez le faire
Sur Python 2, vous devez convertir
len
en flottant pour obtenir la division flottanteIl n'est pas nécessaire d'utiliser
reduce
. Il est beaucoup plus lent et a été supprimé dans Python 3.la source
la source
from __future__ import division
, vous pouvez éliminer ce vilainfloat
.float
est moche comme l'enfer, je voulais juste le garder plus simple.sum(l, 0.0) / len(l)
sum(l) / len(l)
Vous pouvez utiliser
numpy.mean
:la source
sum(l)/len(l)
np.array(l).mean()
c'est beaucoup plus rapide.np.mean(l)
etnp.array(l).mean
sont à peu près la même vitesse, etsum(l)/len(l)
est environ deux fois plus rapide. J'ai utilisél = list(np.random.rand(1000))
, bien sûr, les deuxnumpy
méthodes deviennent beaucoup plus rapides sil
c'est le casnumpy.array
.Un module de statistiques a été ajouté à python 3.4 . Il a une fonction pour calculer la moyenne appelée moyenne . Un exemple avec la liste que vous avez fournie serait:
la source
statistics.StatisticsError: mean requires at least one data point
au lieu d'un plus cryptiqueZeroDivisionError: division by zero
pour lasum(x) / len(x)
solution.Pourquoi utiliseriez-vous
reduce()
cela lorsque Python a unesum()
fonction parfaitement cromulente ?(Le
float()
est nécessaire pour forcer Python à effectuer une division en virgule flottante.)la source
float()
n'est pas nécessaire sur Python 3.Il y a une bibliothèque de statistiques si vous utilisez python> = 3.4
https://docs.python.org/3/library/statistics.html
Vous pouvez utiliser sa méthode moyenne comme celle-ci. Disons que vous avez une liste de nombres dont vous voulez trouver la moyenne: -
Il a aussi d'autres méthodes comme stdev, variance, mode, harmonic mean, median etc. qui sont trop utiles.
la source
Au lieu de lancer pour flotter, vous pouvez ajouter 0,0 à la somme:
la source
sum(l) / float(len(l))
est la bonne réponse, mais juste pour être complet, vous pouvez calculer une moyenne avec une seule réduction:Notez que cela peut entraîner une légère erreur d'arrondi:
la source
reduce()
auquel vous donnerait False pour une liste vide, sinon la moyenne comme avant.float
surlen
?J'ai essayé d'utiliser les options ci-dessus, mais cela n'a pas fonctionné. Essaye ça:
travaillé sur python 3.5
la source
Ou utiliser
pandas
laSeries.mean
méthode de:Démo:
De la documentation:
Et voici les documents pour cela:
Et toute la documentation:
la source
J'avais une question similaire à résoudre dans les problèmes d'un Udacity. Au lieu d'une fonction intégrée, j'ai codé:
Beaucoup plus longtemps que d'habitude, mais pour un débutant, c'est assez difficile.
la source
False
(équivalent à l'entier0
) est à peu près la pire façon possible de gérer cette erreur. Mieux vaut attraper leZeroDivisionError
et élever quelque chose de mieux (peut-êtreValueError
).ValueError
mieux qu'unZeroDivisionError
? Ce dernier est plus spécifique, et il semble un peu inutile d'attraper une erreur arithmétique pour n'en relancer qu'une autre.ZeroDivisionError
que n'est utile que si vous savez comment le calcul est effectué (c'est-à-dire qu'une division par la longueur de la liste est impliquée). Si vous ne le savez pas, cela ne vous dit pas quel est le problème avec la valeur que vous avez transmise. Alors que votre nouvelle exception peut inclure ces informations plus spécifiques.en tant que débutant, je viens de coder ceci:
la source
sum(l)/len(l)
est de loin la réponse la plus élégante (pas besoin de faire des conversions de type en Python 3).Si vous vouliez obtenir plus que la moyenne (aka moyenne), vous pouvez consulter les statistiques scipy
la source
Pour pouvoir utiliser
reduce
une moyenne mobile, vous devrez suivre le total mais aussi le nombre total d'éléments vus jusqu'à présent. comme ce n'est pas un élément trivial dans la liste, vous devrez également passerreduce
un argument supplémentaire pour vous replier.la source
Les deux peuvent vous donner près de valeurs similaires sur un entier ou au moins 10 valeurs décimales. Mais si vous envisagez vraiment de longues valeurs flottantes, les deux peuvent être différents. L'approche peut varier selon ce que vous souhaitez réaliser.
Valeurs flottantes
@Andrew Clark avait raison sur sa déclaration.
la source
supposer que
x = [[-5.01,-5.43,1.08,0.86,-2.67,4.94,-2.51,-2.25,5.56,1.03], [-8.12,-3.48,-5.52,-3.78,0.63,3.29,2.09,-2.13,2.86,-3.33], [-3.68,-3.54,1.66,-4.11,7.39,2.08,-2.59,-6.94,-2.26,4.33]]
vous pouvez remarquer qu'il
x
a une dimension 3 * 10 si vous avez besoin d'obtenir lemean
à chaque ligne, vous pouvez taper cecin'oubliez pas de
import numpy as np
la source
la source
Trouver la moyenne dans la liste En utilisant le code PYTHON suivant:
essayez-le facilement.
la source
ou comme publié précédemment
Le 1.0 est pour vous assurer d'obtenir une division en virgule flottante
la source
En combinant quelques-unes des réponses ci-dessus, j'ai trouvé ce qui suit qui fonctionne avec réduire et ne suppose pas que vous disposez de
L
la fonction de réduction:la source
Je veux ajouter juste une autre approche
la source
la source