Encontrar el promedio de una lista

473

Tengo que encontrar el promedio de una lista en Python. Este es mi código hasta ahora

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

Lo tengo para que agregue los valores de la lista, pero no sé cómo dividirlos.

Carla Dessi
fuente
45
numpy.mean si usted puede permitirse la instalación de numpy
Mitch
77
sum(L) / float(len(L)). manejar listas vacías en el código de la persona que llama comoif not L: ...
n611x007
44
@mitch: no es cuestión de si puedes permitirte instalar numpy. numpy es una palabra completa en sí misma. Es si realmente necesitas numpy. Instalar numpy, una extensión de 16mb C, para el cálculo medio sería, bueno, muy poco práctico, para alguien que no lo use para otras cosas.
n611x007
3
en lugar de instalar todo el paquete numpy por solo avg / mean si usamos python 3, podemos hacer esto usando el módulo estadístico simplemente "desde statistic import mean" o si en python 2.7 o menos, el módulo estadístico se puede descargar desde src: hg.python.org/cpython/file/default/Lib/statistics.py doc: docs.python.org/dev/library/statistics.html y se usa directamente.
25mhz
2
Posible duplicado del cálculo de la media aritmética (promedio) en Python
Pale Blue Dot

Respuestas:

568

En Python 3.4+ puedes usar statistics.mean()

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

import statistics
statistics.mean(l)  # 20.11111111111111

En versiones anteriores de Python puedes hacer

sum(l) / len(l)

En Python 2 necesitas convertir lena un flotador para obtener la división de flotador

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

No hay necesidad de usar reduce. Es mucho más lento y se eliminó en Python 3.

Herms
fuente
99
si la lista está compuesta por ints, el resultado en python 2 será un int
mitch el
Eso es perfecto ! lo siento por la estúpida pregunta, ¡pero realmente he buscado por todas partes eso! Muchas gracias !
Carla Dessi
77
Como dije, soy nuevo en esto, estaba pensando que tendría que hacerlo con un bucle o algo así para contar la cantidad de números, no me di cuenta de que podía usar la longitud. esto es lo primero que he hecho con python ..
Carla Dessi
2
¿Qué pasa si la suma es un número masivo que no cabe en int / float?
Usuario de Foo Bar
55
@FooBarUser, entonces debe calcular k = 1.0 / len (l), y luego reducir: reduce (lambda x, y: x + y * k, l)
Arseniy
519
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
sum(l) / len(l)
yprez
fuente
63
Si lo usa from __future__ import division, puede eliminar eso feo float.
S.Lott
12
Convenido. floates feo como el infierno, solo quería que sea más simple.
yprez
39
Otra forma de eliminar ese flotador 'fea':sum(l, 0.0) / len(l)
remosu
26
Como programador de C ++, ¡eso es impecable y flotante no es feo en absoluto!
lahjaton_j
20
En python3, puedes usarsum(l) / len(l)
VasiliNovikov
283

Puedes usar numpy.mean:

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

import numpy as np
print(np.mean(l))
Akavall
fuente
44
Eso es extraño. Habría asumido que esto sería mucho más eficiente, pero parece tomar 8 veces más tiempo en una lista aleatoria de carrozas que simplementesum(l)/len(l)
L. Amber O'Hearn
8
Ah, pero np.array(l).mean()es mucho más rápido.
L. Amber O'Hearn el
8
@ L.AmberO'Hearn, acabo cronometré y np.mean(l)y np.array(l).meanse refieren a la misma velocidad, y sum(l)/len(l)es aproximadamente el doble de rápido. Solía l = list(np.random.rand(1000)), por supuesto, ambos numpymétodos se vuelven mucho más rápidos si les así numpy.array.
Akavall
11
bueno, a menos que esa sea la única razón para instalar numpy. Instalar un paquete de 16mb C de cualquier fama para el cálculo medio parece muy extraño en esta escala.
n611x007
pero en mi mente. no hay necesidad de preocuparse por la velocidad en condiciones normales ..
tyan
230

Se ha agregado un módulo de estadísticas a Python 3.4 . Tiene una función para calcular el promedio llamado media . Un ejemplo con la lista que proporcionó sería:

from statistics import mean
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
mean(l)
Marwan Alsabbagh
fuente
28
Esta es la respuesta más elegante porque emplea un módulo de biblioteca estándar que está disponible desde python 3.4.
Serge Stroobandt
44
Y es numéricamente más estable
Antti Haapala
Y produce un error más agradable si accidentalmente pasa una lista vacía en statistics.StatisticsError: mean requires at least one data pointlugar de una más críptica ZeroDivisionError: division by zeropara la sum(x) / len(x)solución.
Boris el
45

¿Por qué reduce()usarías esto cuando Python tiene una sum()función perfectamente cromulenta ?

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

( float()Es necesario forzar a Python a hacer una división de punto flotante).

un poco
fuente
34
Para aquellos de nosotros nuevos en la palabra 'cromulento'
RolfBly
1
float()no es necesario en Python 3.
Boris
36

Hay una biblioteca de estadísticas si está usando python> = 3.4

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

Puede usar su método malo como este. Supongamos que tiene una lista de números de los cuales desea encontrar significa:

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

También tiene otros métodos como stdev, varianza, modo, media armónica, mediana, etc., que son demasiado útiles.

Chetan Sharma
fuente
18

En lugar de lanzar para flotar, puede agregar 0.0 a la suma:

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

sum(l) / float(len(l)) es la respuesta correcta, pero solo para completar puede calcular un promedio con una sola reducción:

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

Tenga en cuenta que esto puede provocar un ligero error de redondeo:

>>> sum(l) / float(len(l))
20.111111111111111
Andrew Clark
fuente
Entiendo que esto es solo por diversión, pero devolver 0 para una lista vacía puede no ser lo mejor que se puede hacer
Johan Lundberg
1
@JohanLundberg: podría reemplazar el 0 con False como el último argumento reduce()que le daría False para una lista vacía, de lo contrario, el promedio como antes.
Andrew Clark
@AndrewClark ¿por qué se fuerza floatel len?
EndermanAPM
8

Intenté usar las opciones anteriores pero no funcionó. Prueba esto:

from statistics import mean

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

print(n)
print(mean(n))

trabajó en python 3.5

Ngury Mangueira
fuente
6

O use pandasel Series.meanmétodo de:

pd.Series(sequence).mean()

Manifestación:

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

De los documentos:

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

Y aquí están los documentos para esto:

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

Y toda la documentación:

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

U10-Adelante
fuente
Esta no es una pregunta de pandas, por lo que parece excesivo importar una biblioteca tan pesada para una operación simple como encontrar la media.
cs95
4

Tenía una pregunta similar que resolver en los problemas de Udacity. En lugar de una función incorporada, codifiqué:

def list_mean(n):

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

Mucho más tiempo de lo habitual, pero para un principiante es bastante desafiante.

Paulo YC
fuente
1
Bueno. ¡Cualquier otra respuesta no notó el peligro de la lista vacía!
wsysuper
1
Devolver False(equivalente al número entero 0) es la peor forma posible de manejar este error. Es mejor atrapar ZeroDivisionErrory criar algo mejor (tal vez ValueError).
poco
@kindall, ¿cómo es un ValueErrormejor que un ZeroDivisionError? Este último es más específico, además parece un poco innecesario detectar un error aritmético solo para volver a lanzar uno diferente.
MatTheWhale
Porque ZeroDivisionErrorsolo es útil si sabe cómo se está haciendo el cálculo (es decir, que está involucrada una división por la longitud de la lista). Si no lo sabe, no le dice cuál es el problema con el valor que pasó. Mientras que su nueva excepción puede incluir esa información más específica.
poco
4

Como principiante, acabo de codificar esto:

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
fuente
Bravo: en mi humilde opinión, sum(l)/len(l)es , con mucho, la respuesta más elegante (no es necesario realizar conversiones de tipo en Python 3).
fralau
4

Si desea obtener algo más que la media (también conocido como promedio), puede consultar las estadísticas desordenadas

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

Para usar reducepara tomar un promedio de ejecución, necesitará rastrear el total pero también el número total de elementos vistos hasta ahora. Como ese no es un elemento trivial en la lista, también tendrá que pasar reduceun argumento adicional para plegar.

>>> 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
fuente
1
interesante pero eso no es lo que pidió.
Johan Lundberg
3

Ambos pueden darle valores cercanos a valores similares en un entero o al menos 10 valores decimales. Pero si realmente está considerando valores flotantes largos, ambos pueden ser diferentes. El enfoque puede variar en lo que desea lograr.

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

Valores flotantes

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

@Andrew Clark tenía razón en su declaración.

Superpaul
fuente
3

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

puede notar que xtiene una dimensión 3 * 10 si necesita obtener el meanpara cada fila, puede escribir esto

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

no te olvides de import numpy as np

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

l = map(float,l)
print '%.2f' %(sum(l)/len(l))
usuario1871712
fuente
3
Ineficiente. Convierte todos los elementos en flotantes antes de agregarlos. Es más rápido convertir solo la longitud.
Chris Koston el
1

Encuentre el promedio en la lista utilizando el siguiente código PYTHON :

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

Intenta esto con facilidad.

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

o como publicado anteriormente

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

El 1.0 es para asegurarse de obtener una división de coma flotante

RussS
fuente
0

Combinando un par de las respuestas anteriores, se me ocurrió lo siguiente que funciona con reducción y no supone que tenga Ldisponible dentro de la función de reducción:

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

Quiero agregar solo otro enfoque

import itertools,operator
list(itertools.accumulate(l,operator.add)).pop(-1) / len(l)
Taylan
fuente
-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
fuente
¿Qué pasa si el usuario agrega números de coma flotante a su matriz? Los resultados serán súper imprecisos.
Llama_Phoenix