web-dev-qa-db-fra.com

Trouver la moyenne d'une liste

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 ajoute les valeurs dans la liste, mais je ne sais pas comment le diviser en elles?

415
Carla Dessi

Si votre réduction renvoie déjà votre somme, il ne vous reste plus qu'à diviser.

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

cependant, sum(l)/len(l) serait plus simple, car vous n’auriez pas besoin d’un lambda.

Si vous voulez un résultat float plus exact au lieu d'un int, utilisez simplement float(len(l)) au lieu de len(l).

487
Herms
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
sum(l) / float(len(l))
503
yprez

Ou vous pouvez utiliser numpy.mean :

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

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

Un module 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)
220
Marwan Alsabbagh

Pourquoi voudriez-vous utiliser reduce() pour cela lorsque Python a une fonction parfaitement cromulent sum()?

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

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

44
kindall

Il existe une bibliothèque de statistiques si vous utilisez python> = 3.4

https://docs.python.org/3/library/statistics.html

Vous pouvez utiliser c'est moyen moyen comme ça. Disons que vous avez une liste de nombres dont vous voulez trouver le moyen: -

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

Il a aussi d'autres méthodes comme stdev, variance, mode, moyenne harmonique, médiane, etc. qui sont trop utiles.

32
Chetan Sharma

Au lieu de lancer en float, vous pouvez ajouter 0.0 à la somme:

def avg(l):
    return sum(l, 0.0) / len(l)
18
Maxime Chéramy

sum(l) / float(len(l)) est la bonne réponse, mais juste pour compléter, 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
10
Andrew Clark

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

from statistics import mean

n = [11, 13, 15, 17, 19]
print(n)
print(mean(n))

travaillé sur python 3.5

7
Ngury Mangueira

Ou utilisez la méthode pandas 'Series.mean:

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

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

Et voici la documentation 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

5
U10-Forward

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)
4
leo0019

J'ai eu 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 long que d'habitude, mais pour un débutant, c'est assez difficile.

4
Paulo YC

Si vous voulez 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)
4
jasonleonhard

Les deux peuvent vous donner des valeurs proches 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 en fonction de vos objectifs.

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

Pour utiliser reduce pour prendre une moyenne courante, vous devez suivre le total mais également le nombre total d'éléments vus jusqu'à présent. comme ce n’est pas un élément trivial de la liste, vous devrez également passer reduce un argument supplémentaire dans lequel vous plier.

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

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 que x a la dimension 3 * 10 si vous devez obtenir le mean à chaque ligne, vous pouvez taper ceci

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

n'oubliez pas de import numpy as np

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

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

Trouvez 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 ceci c'est facile.

1
Mani Kandan

En combinant quelques-unes des réponses ci-dessus, j'ai proposé ce qui suit qui fonctionne avec réduction et ne suppose pas que vous avez L disponible dans la 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
reubano

Je veux ajouter juste une autre approche

import itertools,operator
list(itertools.accumulate(l,operator.add)).pop(-1) / len(l)
0
Taylan
print reduce(lambda x, y: x + y, l)/(len(l)*1.0)

ou comme précédemment posté

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

La 1.0 est de s'assurer que vous obtenez une division en virgule flottante

0
RussS