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.
sum(L) / float(len(L))
. manipular listas vazias no código de chamada comoif not L: ...
Respostas:
No Python 3.4+, você pode usar
statistics.mean()
Nas versões mais antigas do Python, você pode fazer
No Python 2, você precisa converter
len
para um float para obter a divisão floatNão há necessidade de usar
reduce
. É muito mais lento e foi removido no Python 3.fonte
fonte
from __future__ import division
, você pode eliminar esse feiofloat
.float
é feio como o inferno, só queria mantê-lo mais simples.sum(l, 0.0) / len(l)
sum(l) / len(l)
Você pode usar
numpy.mean
:fonte
sum(l)/len(l)
np.array(l).mean()
é muito mais rápido.np.mean(l)
enp.array(l).mean
estão prestes a mesma velocidade, esum(l)/len(l)
é cerca de duas vezes mais rápido. Eu useil = list(np.random.rand(1000))
, é claro que ambos osnumpy
métodos se tornam muito mais rápidos, sel
fornumpy.array
.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:
fonte
statistics.StatisticsError: mean requires at least one data point
vez de mais enigmáticaZeroDivisionError: division by zero
para asum(x) / len(x)
solução.Por que você usaria
reduce()
isso quando o Python tem umasum()
função perfeitamente cromulenta ?(
float()
É necessário forçar o Python a fazer uma divisão de ponto flutuante.)fonte
float()
não é necessário no Python 3.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: -
Também possui outros métodos, como stdev, variância, modo, média harmônica, mediana, etc., que são muito úteis.
fonte
Em vez de converter para flutuar, você pode adicionar 0,0 à soma:
fonte
sum(l) / float(len(l))
é a resposta certa, mas, para completar, você pode calcular uma média com uma única redução:Observe que isso pode resultar em um pequeno erro de arredondamento:
fonte
reduce()
qual daria False para uma lista vazia, caso contrário, a média como antes.float
onlen
?Tentei usar as opções acima, mas não funcionou. Tente o seguinte:
trabalhou em python 3.5
fonte
Ou use
pandas
oSeries.mean
método:Demo:
Dos documentos:
E aqui estão os documentos para isso:
E toda a documentação:
fonte
Eu tinha uma pergunta semelhante para resolver nos problemas de um Udacity. Em vez de uma função interna, eu codifiquei:
Muito mais tempo do que o habitual, mas para um iniciante é bastante desafiador.
fonte
False
(equivalente ao número inteiro0
) é apenas a pior maneira possível de lidar com esse erro. Melhor pegar oZeroDivisionError
e levantar algo melhor (talvezValueError
).ValueError
melhor que aZeroDivisionError
? O último é mais específico, além de parecer um pouco desnecessário capturar um erro aritmético apenas para retornar um erro diferente.ZeroDivisionError
só é ú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.como iniciante, eu apenas codifiquei isso:
fonte
sum(l)/len(l)
é de longe a resposta mais elegante (não é necessário fazer conversões de tipo no Python 3).Se você quiser obter mais do que apenas a média (também conhecida como média), consulte as estatísticas
fonte
Para usar
reduce
para 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á passarreduce
um argumento extra para inserir.fonte
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.
Valores flutuantes
Andrew Clark estava certo em sua declaração.
fonte
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
x
tem a dimensão 3 * 10, se precisar obter omean
para cada linha, você pode digitar issonão esqueça de
import numpy as np
fonte
fonte
Encontre a média na lista Usando o seguinte código PYTHON :
tente isso com facilidade.
fonte
ou como postado anteriormente
O 1.0 é para garantir que você obtenha uma divisão de ponto flutuante
fonte
Combinando algumas das respostas acima, criei o seguinte, que funciona com o reduzir e não assume que você tenha
L
disponível dentro da função de redução:fonte
Eu quero adicionar apenas outra abordagem
fonte
fonte