Como você encontra a mediana de uma lista no Python? A lista pode ser de qualquer tamanho e não é garantido que os números estejam em uma ordem específica.
Se a lista contiver um número par de elementos, a função retornará a média dos dois do meio.
Aqui estão alguns exemplos (classificados para fins de exibição):
median([1]) == 1
median([1, 1]) == 1
median([1, 1, 2, 4]) == 1.5
median([0, 2, 5, 6, 8, 9, 9]) == 6
median([0, 0, 0, 0, 4, 4, 6, 8]) == 2
Respostas:
O Python 3.4 possui
statistics.median
:Uso:
Também é muito cuidadoso com os tipos:
fonte
pip3 install itunizer
para adicionar dados medianos aos resultados da consulta. Cheers(Funciona com python-2.x):
numpy.median()
:Para python-3.x, use
statistics.median
:fonte
A função classificada () é muito útil para isso. Use a função classificada para ordenar a lista e, em seguida, simplesmente retorne o valor do meio (ou calcule a média dos dois valores do meio, se a lista contiver uma quantidade uniforme de elementos).
fonte
Aqui está uma solução mais limpa:
Nota: Resposta alterada para incorporar sugestões nos comentários.
fonte
float(sum(…) / 2)
deve ser substituído porsum(…) / 2.0
; caso contrário, sesum(…)
for um número inteiro, você obterá uma versão flutuante do quociente inteiro. Por exemplo:float(sum([3, 4]) / 2)
é3.0
, massum([3, 4]) / 2.0
é3.5
.from __future__ import division
.Você pode tentar o algoritmo de seleção rápida se forem necessários tempos de execução médios mais rápidos. O Quickselect tem desempenho médio (e melhor)
O(n)
, embora possa acabarO(n²)
em um dia ruim.Aqui está uma implementação com um pivô escolhido aleatoriamente:
Você pode transformar isso trivialmente em um método para encontrar medianas:
Isso é muito não otimizado, mas não é provável que mesmo uma versão otimizada supere o Tim Sort (embutido no CPython
sort
) porque isso é muito rápido . Eu tentei antes e perdi.fonte
sort
facilmente, ou disposto a escrever uma extensão de C para a velocidade, etc.É claro que você pode usar funções de compilação, mas se quiser criar as suas próprias, poderá fazer algo assim. O truque aqui é usar o operador ~ que inverte o número positivo para negativo. Por exemplo, ~ 2 -> -3 e usar negativo na lista em Python contará itens do final. Portanto, se você tiver um meio == 2, será necessário o terceiro elemento do início e o terceiro item do final.
fonte
Você pode usar o
list.sort
para evitar a criação de novas listassorted
e classificar as listas no local.Além disso, você não deve usar
list
como um nome de variável, uma vez que oculta a própria lista do python .fonte
mylist.sort(); middle(mylist)
, mas é inegavelmente uma questão de gosto. Eu apenas acho que a mutação em geral deve ser reservada para métodos, tanto quanto possível. O motivo list.sort () retorna None, em vez da própria lista, é tornar o comportamento o mais óbvio e claro possível. Ocultar tudo na documentação é como ocultar coisas em letras pequenas.fonte
fonte
Postei minha solução na implementação em Python do algoritmo "mediana de medianas" , que é um pouco mais rápido do que usar sort (). Minha solução usa 15 números por coluna, para uma velocidade de ~ 5N que é mais rápida que a velocidade ~ 10N de usar 5 números por coluna. A velocidade ideal é de ~ 4N, mas eu posso estar errado sobre isso.
De acordo com o pedido de Tom em seu comentário, adicionei meu código aqui, para referência. Acredito que a parte crítica da velocidade é usar 15 números por coluna, em vez de 5.
fonte
Aqui o que eu criei durante este exercício na Codecademy:
fonte
Função mediana
fonte
Eu tive alguns problemas com listas de valores flutuantes. Acabei usando um trecho de código do python3 Statistics.median e está funcionando perfeitamente com valores flutuantes sem importações. fonte
fonte
fonte
Eu defini uma função mediana para uma lista de números como
fonte
fonte
mediana da função:
fonte
Caso você precise de informações adicionais sobre a distribuição da sua lista, o método do percentil provavelmente será útil. E um valor mediano corresponde ao percentil 50 de uma lista:
fonte
Uma função simples para retornar a mediana da lista fornecida:
se você quiser usar a biblioteca, você pode simplesmente fazer;
fonte
fonte
Uma abordagem mais generalizada para mediana (e percentis) seria:
fonte
Aqui está a maneira tediosa de encontrar mediana sem usar a
median
função:fonte
É muito simples;
E você pode usar o valor de retorno como este
median = median(anyList)
fonte
sList
retorne a matriz classificada. Não retorna a mediana