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.


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

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.


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)

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

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)

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


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.


18

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

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

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

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


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


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.


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)

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)

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

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.


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


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

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

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.


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


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

0

Quiero agregar solo otro enfoque

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)

¿Qué pasa si el usuario agrega números de coma flotante a su matriz? Los resultados serán súper imprecisos.
Llama_Phoenix
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.