Encontrando a média de uma lista

473

Eu tenho que encontrar a média de uma lista em Python. Este é o meu código até agora

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

Eu entendi, para que ele agregue os valores da lista, mas não sei como dividir entre eles.

Carla Dessi
fonte
45
numpy.mean se você puder pagar pela instalação do numpy
mitch
7
sum(L) / float(len(L)). manipular listas vazias no código de chamada comoif not L: ...
n611x007
4
@itch: não é uma questão de saber se você pode pagar instalando numpy. numpy é uma palavra inteira em si. É se você realmente precisa de dormida. Instalar numpy, uma extensão de 16mb C, para calcular a média seria, bem, muito impraticável, para alguém que não o usa para outras coisas.
N611x007
3
em vez de instalar o pacote numpy inteiro por apenas avg / mean, se estiver usando o python 3, podemos fazer isso usando o módulo estatístico apenas "da estatística de importação estatística" ou, no python 2.7 ou menos, o módulo estatístico pode ser baixado do src: hg.python.org/cpython/file/default/Lib/statistics.py doc: docs.python.org/dev/library/statistics.html e usado diretamente.
25mhz 18/07/2016
2
Possível duplicado do cálculo da média aritmética (média) em Python
Pálido Ponto Azul

Respostas:

568

No Python 3.4+, você pode usar statistics.mean()

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

import statistics
statistics.mean(l)  # 20.11111111111111

Nas versões mais antigas do Python, você pode fazer

sum(l) / len(l)

No Python 2, você precisa converter lenpara um float para obter a divisão float

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

Não há necessidade de usar reduce. É muito mais lento e foi removido no Python 3.

Herms
fonte
9
se a lista é composta de ints, o resultado no python 2 será um int
mitch
Perfeito ! desculpe pela pergunta estúpida, mas eu realmente procurei por toda parte! muito obrigado !
Carla Dessi
7
Como eu disse, sou novo nisso, eu estava pensando que teria que fazer um loop ou algo para contar a quantidade de números, não sabia que poderia usar o comprimento. esta é a primeira coisa que eu fiz com python ..
Carla Dessi
2
e se a soma for um número enorme que não caiba em int / float?
Usuário
5
@FooBarUser então que deveria calc K = 1,0 / len (l), e, em seguida, reduzir: reduzir (lambda x, y: x + y * k, l)
Arseniy
519
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
sum(l) / len(l)
yprez
fonte
63
Se você usar from __future__ import division, você pode eliminar esse feio float.
precisa saber é o seguinte
12
Acordado. floaté feio como o inferno, só queria mantê-lo mais simples.
precisa saber é
39
Outra maneira de eliminar esse flutuador 'feio':sum(l, 0.0) / len(l)
remosu
26
Como programador de C ++, isso é legal como o inferno e a flutuação não é nada feia!
precisa saber é o seguinte
20
Em python3, você pode apenas usarsum(l) / len(l)
VasiliNovikov
283

Você pode usar numpy.mean:

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

import numpy as np
print(np.mean(l))
Akavall
fonte
4
Isso é estranho. Eu teria assumido isso seria muito mais eficiente, mas parece ter 8 vezes mais tempo em uma lista aleatória de carros alegóricos que simplesmentesum(l)/len(l)
L. Âmbar O'Hearn
8
Ah, mas np.array(l).mean()é muito mais rápido.
L. Amber O'Hearn
8
@ L.AmberO'Hearn, eu só cronometrado e np.mean(l)e np.array(l).meanestão prestes a mesma velocidade, e sum(l)/len(l)é cerca de duas vezes mais rápido. Eu usei l = list(np.random.rand(1000)), é claro que ambos os numpymétodos se tornam muito mais rápidos, se lfor numpy.array.
Akavall 23/09/15
11
bem, a menos que seja a única razão para instalar o numpy. instalar um pacote de 16mb C de qualquer fama para o cálculo médio parece muito estranho nessa escala.
N611x007
mas na minha mind.there não é preciso se preocupar com a velocidade em condição normal ..
tyan
230

Um módulo de estatísticas foi adicionado ao python 3.4 . Tem uma função para calcular a média chamada média . Um exemplo com a lista que você forneceu seria:

from statistics import mean
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
mean(l)
Marwan Alsabbagh
fonte
28
Essa é a resposta mais elegante, pois emprega um módulo de biblioteca padrão que está disponível desde o python 3.4.
Serge Stroobandt
4
E é numericamente estável
Antti Haapala
E produz um erro melhor se você passar acidentalmente em uma lista vazia em statistics.StatisticsError: mean requires at least one data pointvez de mais enigmática ZeroDivisionError: division by zeropara a sum(x) / len(x)solução.
Boris
45

Por que você usaria reduce()isso quando o Python tem uma sum()função perfeitamente cromulenta ?

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

( float()É necessário forçar o Python a fazer uma divisão de ponto flutuante.)

kindall
fonte
34
Para aqueles de nós de novo para a palavra 'cromulent'
RolfBly
1
float()não é necessário no Python 3.
Boris
36

Existe uma biblioteca de estatísticas se você estiver usando python> = 3.4

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

Você pode usar seu método médio como este. Digamos que você tenha uma lista de números dos quais deseja encontrar média: -

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

Também possui outros métodos, como stdev, variância, modo, média harmônica, mediana, etc., que são muito úteis.

Chetan Sharma
fonte
18

Em vez de converter para flutuar, você pode adicionar 0,0 à soma:

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

sum(l) / float(len(l)) é a resposta certa, mas, para completar, você pode calcular uma média com uma única redução:

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

Observe que isso pode resultar em um pequeno erro de arredondamento:

>>> sum(l) / float(len(l))
20.111111111111111
Andrew Clark
fonte
Eu entendo que isso é apenas por diversão, mas devolver 0 para uma lista vazia pode não ser a melhor coisa a fazer
Johan Lundberg
1
@JohanLundberg - Você pode substituir o 0 por False como o último argumento ao reduce()qual daria False para uma lista vazia, caso contrário, a média como antes.
Andrew Clark
@AndrewClark por que você force floaton len?
precisa
8

Tentei usar as opções acima, mas não funcionou. Tente o seguinte:

from statistics import mean

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

print(n)
print(mean(n))

trabalhou em python 3.5

Ngury Mangueira
fonte
6

Ou use pandaso Series.meanmétodo:

pd.Series(sequence).mean()

Demo:

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

Dos documentos:

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

E aqui estão os documentos para isso:

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

E toda a documentação:

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

Sub-10
fonte
Esta não é uma questão de pandas, por isso parece excessivo importar uma biblioteca tão pesada para uma operação simples como encontrar a média.
cs95
4

Eu tinha uma pergunta semelhante para resolver nos problemas de um Udacity. Em vez de uma função interna, eu codifiquei:

def list_mean(n):

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

Muito mais tempo do que o habitual, mas para um iniciante é bastante desafiador.

Paulo YC
fonte
1
Boa. Todas as outras respostas não notaram o risco da lista vazia!
wsysuper
1
Retornar False(equivalente ao número inteiro 0) é apenas a pior maneira possível de lidar com esse erro. Melhor pegar o ZeroDivisionErrore levantar algo melhor (talvez ValueError).
Kindall
@kindall como é ValueErrormelhor que a ZeroDivisionError? O último é mais específico, além de parecer um pouco desnecessário capturar um erro aritmético apenas para retornar um erro diferente.
MatTheWhale 27/03
Porque ZeroDivisionErrorsó é útil se você souber como o cálculo está sendo feito (ou seja, que uma divisão pelo comprimento da lista está envolvida). Se você não sabe disso, não informa qual é o problema com o valor que você passou. Enquanto sua nova exceção pode incluir essas informações mais específicas.
Kindall
4

como iniciante, eu apenas codifiquei isso:

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
fonte
Bravo: IMHO, sum(l)/len(l)é de longe a resposta mais elegante (não é necessário fazer conversões de tipo no Python 3).
Fralau 9/05/19
4

Se você quiser obter mais do que apenas a média (também conhecida como média), consulte as estatísticas

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

Para usar reducepara obter uma média atual, você precisará acompanhar o total, mas também o número total de elementos vistos até o momento. como esse não é um elemento trivial da lista, você também precisará passar reduceum argumento extra para inserir.

>>> 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
fonte
1
interessante, mas não foi o que ele pediu.
Johan Lundberg
3

Ambos podem fornecer valores semelhantes em um número inteiro ou pelo menos 10 valores decimais. Mas se você está realmente considerando valores flutuantes longos, ambos podem ser diferentes. A abordagem pode variar de acordo com o que você deseja alcançar.

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

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

Andrew Clark estava certo em sua declaração.

Superpaul
fonte
3

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

você pode notar que xtem a dimensão 3 * 10, se precisar obter o meanpara cada linha, você pode digitar isso

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

não esqueça de import numpy as np

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

l = map(float,l)
print '%.2f' %(sum(l)/len(l))
user1871712
fonte
3
Ineficiente. Ele converte todos os elementos para flutuar antes de adicioná-los. É mais rápido converter apenas o comprimento.
22613 Chris Koston
1

Encontre a média na lista Usando o seguinte código PYTHON :

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

tente isso com facilidade.

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

ou como postado anteriormente

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

O 1.0 é para garantir que você obtenha uma divisão de ponto flutuante

RussS
fonte
0

Combinando algumas das respostas acima, criei o seguinte, que funciona com o reduzir e não assume que você tenha Ldisponível dentro da função de redução:

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

Eu quero adicionar apenas outra abordagem

import itertools,operator
list(itertools.accumulate(l,operator.add)).pop(-1) / len(l)
Taylan
fonte
-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
fonte
e se o usuário adicionar números de ponto flutuante à sua matriz? Os resultados serão super imprecisos.
Flame_Phoenix 17/11