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?

Carla Dessi
la source
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
2
Duplication possible de Calcul de la moyenne arithmétique (moyenne) en Python
Pale Blue Dot

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.

Herms
la source
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)
yprez
la source
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))
Akavall
la source
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)
Marwan Alsabbagh
la source
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.)

gentil
la source
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.

Chetan Sharma
la source
18

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

def avg(l):
    return sum(l, 0.0) / len(l)
Maxime Chéramy
la source
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
Andrew Clark
la source
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

Ngury Mangueira
la source
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

U10-Forward
la source
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.

Paulo YC
la source
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)
AlmoDev
la source
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)
jasonleonhard
la source
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
SingleNegationElimination
la source
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.

Superpaul
la source
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

Mohamed A M-Hassan
la source
1
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]

l = map(float,l)
print '%.2f' %(sum(l)/len(l))
user1871712
la source
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.

Mani Kandan
la source
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

RussS
la source
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
reubano
la source
0

Je veux ajouter juste une autre approche

import itertools,operator
list(itertools.accumulate(l,operator.add)).pop(-1) / len(l)
Taylan
la source
-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)
Oscar Wade
la source
que faire si l'utilisateur ajoute des nombres à virgule flottante à votre tableau? Les résultats seront super imprécis.
Flame_Phoenix