Trouver la moyenne d'une liste


473

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?


45
numpy.mean si vous pouvez vous permettre d'installer numpy
mitch

7
sum(L) / float(len(L)). gérer les listes vides dans le code de l'appelant commeif not L: ...
n611x007

4
@mitch: il ne s'agit pas de savoir si vous pouvez vous permettre d'installer numpy. numpy est un mot entier en soi. C'est si vous avez réellement besoin de numpy. Installer numpy, une extension C de 16 Mo, pour le calcul moyen serait, bien, très peu pratique, pour quelqu'un qui ne l'utilise pas pour autre chose.
n611x007

3
au lieu d'installer l'ensemble du paquet numpy pour juste avg / mean si vous utilisez python 3, nous pouvons faire cela en utilisant le module statistique simplement par "à partir de la moyenne d'importation statistique" ou si sur python 2.7 ou moins, le module statistique peut être téléchargé depuis src: hg.python.org/cpython/file/default/Lib/statistics.py doc: docs.python.org/dev/library/statistics.html et directement utilisé.
25mhz

Réponses:


568

Sur Python 3.4+, vous pouvez utiliser statistics.mean()

l = [15, 18, 2, 36, 12, 78, 5, 6, 9]

import statistics
statistics.mean(l)  # 20.11111111111111

Sur les anciennes versions de Python, vous pouvez le faire

sum(l) / len(l)

Sur Python 2, vous devez convertir lenen flottant pour obtenir la division flottante

sum(l) / float(len(l))

Il n'est pas nécessaire d'utiliser reduce. Il est beaucoup plus lent et a été supprimé dans Python 3.


9
si la liste est composée d'ints, le résultat sous python 2 sera un int
mitch

C'est parfait ! désolé pour la question stupide, mais j'ai vraiment cherché partout pour ça! Merci beaucoup !
Carla Dessi

7
comme je l'ai dit, je suis nouveau dans ce domaine, je pensais que je devrais le faire avec une boucle ou quelque chose pour compter le nombre de chiffres, je ne savais pas que je pouvais simplement utiliser la longueur. c'est la première chose que j'ai faite avec python ..
Carla Dessi

2
que faire si la somme est un nombre massif qui ne rentre pas dans int / float?
Foo Bar User

5
@FooBarUser alors vous devez calculer k = 1.0 / len (l), puis réduire: réduire (lambda x, y: x + y * k, l)
Arseniy

519
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
sum(l) / len(l)

63
Si vous utilisez from __future__ import division, vous pouvez éliminer ce vilain float.
S.Lott

12
D'accord. floatest moche comme l'enfer, je voulais juste le garder plus simple.
yprez

39
Une autre façon d'éliminer ce flotteur "laid":sum(l, 0.0) / len(l)
remosu

26
En tant que programmeur C ++, c'est bien comme l'enfer et float n'est pas laid du tout!
lahjaton_j

20
En python3, vous pouvez simplement utilisersum(l) / len(l)
VasiliNovikov

283

Vous pouvez utiliser numpy.mean:

l = [15, 18, 2, 36, 12, 78, 5, 6, 9]

import numpy as np
print(np.mean(l))

4
C'est étrange. J'aurais supposé que ce serait beaucoup plus efficace, mais cela semble prendre 8 fois plus de temps sur une liste aléatoire de flotteurs que simplementsum(l)/len(l)
L. Amber O'Hearn

8
Oh, mais np.array(l).mean()c'est beaucoup plus rapide.
L. Amber O'Hearn

8
@ L.AmberO'Hearn, je minuté et np.mean(l)et np.array(l).meansont à peu près la même vitesse, et sum(l)/len(l)est environ deux fois plus rapide. J'ai utilisé l = list(np.random.rand(1000)), bien sûr, les deux numpyméthodes deviennent beaucoup plus rapides si lc'est le cas numpy.array.
Akavall

11
bien, à moins que ce soit la seule raison d'installer numpy. l'installation d'un package C de 16 Mo de toute renommée pour le calcul de la moyenne semble très étrange à cette échelle.
n611x007

mais dans mon esprit, il n'y a pas besoin de se soucier de la vitesse dans des conditions normales ..
tyan

230

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:

from statistics import mean
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
mean(l)

28
C'est la réponse la plus élégante car elle utilise un module de bibliothèque standard disponible depuis python 3.4.
Serge Stroobandt

4
Et c'est numériquement plus stable
Antti Haapala

Et cela produit une erreur plus agréable si vous passez accidentellement dans une liste vide statistics.StatisticsError: mean requires at least one data pointau lieu d'un plus cryptique ZeroDivisionError: division by zeropour la sum(x) / len(x)solution.
Boris

45

Pourquoi utiliseriez-vous reduce()cela lorsque Python a une sum()fonction parfaitement cromulente ?

print sum(l) / float(len(l))

(Le float()est nécessaire pour forcer Python à effectuer une division en virgule flottante.)


34
Pour ceux d'entre nous qui découvrent
RolfBly

1
float()n'est pas nécessaire sur Python 3.
Boris

36

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

list = [11, 13, 12, 15, 17]
import statistics as s
s.mean(list)

Il a aussi d'autres méthodes comme stdev, variance, mode, harmonic mean, median etc. qui sont trop utiles.


18

Au lieu de lancer pour flotter, vous pouvez ajouter 0,0 à la somme:

def avg(l):
    return sum(l, 0.0) / len(l)

10

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:

>>> reduce(lambda x, y: x + y / float(len(l)), l, 0)
20.111111111111114

Notez que cela peut entraîner une légère erreur d'arrondi:

>>> sum(l) / float(len(l))
20.111111111111111

Je comprends que c'est juste pour le plaisir, mais retourner 0 pour une liste vide n'est peut-être pas la meilleure chose à faire
Johan Lundberg

1
@JohanLundberg - Vous pouvez remplacer le 0 par False comme dernier argument reduce()auquel vous donnerait False pour une liste vide, sinon la moyenne comme avant.
Andrew Clark

@AndrewClark pourquoi forcer-vous floatsur len?
EndermanAPM

8

J'ai essayé d'utiliser les options ci-dessus, mais cela n'a pas fonctionné. Essaye ça:

from statistics import mean

n = [11, 13, 15, 17, 19]

print(n)
print(mean(n))

travaillé sur python 3.5


6

Ou utiliser pandas la Series.meanméthode de:

pd.Series(sequence).mean()

Démo:

>>> import pandas as pd
>>> l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
>>> pd.Series(l).mean()
20.11111111111111
>>> 

De la documentation:

Series.mean(axis=None, skipna=None, level=None, numeric_only=None, **kwargs)

Et voici les documents pour cela:

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.mean.html

Et toute la documentation:

https://pandas.pydata.org/pandas-docs/stable/10min.html


Ce n'est pas une question de pandas, il semble donc excessif d'importer une bibliothèque aussi lourde pour une opération simple comme trouver la moyenne.
cs95

4

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é:

def list_mean(n):

    summing = float(sum(n))
    count = float(len(n))
    if n == []:
        return False
    return float(summing/count)

Beaucoup plus longtemps que d'habitude, mais pour un débutant, c'est assez difficile.


1
Bien. Toutes les autres réponses n'ont pas remarqué le risque de liste vide!
wsysuper

1
Le retour False(équivalent à l'entier 0) est à peu près la pire façon possible de gérer cette erreur. Mieux vaut attraper le ZeroDivisionErroret élever quelque chose de mieux (peut-être ValueError).
kindall

@kindall comment vaut ValueErrormieux qu'un ZeroDivisionError? 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.
MatTheWhale

Parce ZeroDivisionErrorque 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.
kindall

4

en tant que débutant, je viens de coder ceci:

L = [15, 18, 2, 36, 12, 78, 5, 6, 9]

total = 0

def average(numbers):
    total = sum(numbers)
    total = float(total)
    return total / len(numbers)

print average(L)

Bravo: à mon humble avis, 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).
fralau

4

Si vous vouliez obtenir plus que la moyenne (aka moyenne), vous pouvez consulter les statistiques scipy

from scipy import stats
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
print(stats.describe(l))

# DescribeResult(nobs=9, minmax=(2, 78), mean=20.11111111111111, 
# variance=572.3611111111111, skewness=1.7791785448425341, 
# kurtosis=1.9422716419666397)

3

Pour pouvoir utiliser reduceune 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 passer reduceun argument supplémentaire pour vous replier.

>>> l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
>>> running_average = reduce(lambda aggr, elem: (aggr[0] + elem, aggr[1]+1), l, (0.0,0))
>>> running_average[0]
(181.0, 9)
>>> running_average[0]/running_average[1]
20.111111111111111

1
intéressant mais ce n'est pas ce qu'il a demandé.
Johan Lundberg

3

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.

>>> l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
>>> print reduce(lambda x, y: x + y, l) / len(l)
20
>>> sum(l)/len(l)
20

Valeurs flottantes

>>> print reduce(lambda x, y: x + y, l) / float(len(l))
20.1111111111
>>> print sum(l)/float(len(l))
20.1111111111

@Andrew Clark avait raison sur sa déclaration.


3

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 xa une dimension 3 * 10 si vous avez besoin d'obtenir le meanà chaque ligne, vous pouvez taper ceci

theMean = np.mean(x1,axis=1)

n'oubliez pas de import numpy as np


1
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]

l = map(float,l)
print '%.2f' %(sum(l)/len(l))

3
Inefficace. Il convertit tous les éléments en flottant avant de les ajouter. Il est plus rapide de convertir uniquement la longueur.
Chris Koston

1

Trouver la moyenne dans la liste En utilisant le code PYTHON suivant:

l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
print(sum(l)//len(l))

essayez-le facilement.


0
print reduce(lambda x, y: x + y, l)/(len(l)*1.0)

ou comme publié précédemment

sum(l)/(len(l)*1.0)

Le 1.0 est pour vous assurer d'obtenir une division en virgule flottante


0

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 Lla fonction de réduction:

from operator import truediv

L = [15, 18, 2, 36, 12, 78, 5, 6, 9]

def sum_and_count(x, y):
    try:
        return (x[0] + y, x[1] + 1)
    except TypeError:
        return (x + y, 2)

truediv(*reduce(sum_and_count, L))

# prints 
20.11111111111111

0

Je veux ajouter juste une autre approche

import itertools,operator
list(itertools.accumulate(l,operator.add)).pop(-1) / len(l)

-5
numbers = [0,1,2,3]

numbers[0] = input("Please enter a number")

numbers[1] = input("Please enter a second number")

numbers[2] = input("Please enter a third number")

numbers[3] = input("Please enter a fourth number")

print (numbers)

print ("Finding the Avarage")

avarage = int(numbers[0]) + int(numbers[1]) + int(numbers[2]) + int(numbers [3]) / 4

print (avarage)

que faire si l'utilisateur ajoute des nombres à virgule flottante à votre tableau? Les résultats seront super imprécis.
Flame_Phoenix
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.