¿Cómo encuentras la mediana de una lista en Python? La lista puede ser de cualquier tamaño y no se garantiza que los números estén en ningún orden en particular.
Si la lista contiene un número par de elementos, la función debería devolver el promedio de los dos medios.
Aquí hay algunos ejemplos (ordenados para mostrar):
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
Respuestas:
Python 3.4 tiene
statistics.median
:Uso:
También es bastante cuidadoso con los tipos:
fuente
pip3 install itunizer
para agregar datos medianos a los resultados de la consulta. Saludos(Funciona con python-2.x):
numpy.median()
:por python-3.x, use
statistics.median
:fuente
La función sorted () es muy útil para esto. Use la función ordenada para ordenar la lista, luego simplemente devuelva el valor medio (o promedie los dos valores medios si la lista contiene una cantidad par de elementos).
fuente
Aquí hay una solución más limpia:
Nota: La respuesta cambió para incorporar sugerencias en los comentarios.
fuente
float(sum(…) / 2)
debe ser reemplazado consum(…) / 2.0
; de lo contrario, sisum(…)
es un entero, obtendrá una versión flotante del cociente entero. Por ejemplo:float(sum([3, 4]) / 2)
es3.0
, perosum([3, 4]) / 2.0
es3.5
.from __future__ import division
.Puede probar el algoritmo de selección rápida si se necesitan tiempos de ejecución de caso promedio más rápidos. Quickselect tiene un rendimiento promedio (y el mejor) de los casos
O(n)
, aunque puede terminarO(n²)
en un mal día.Aquí hay una implementación con un pivote elegido al azar:
Puede convertir esto trivialmente en un método para encontrar medianas:
Esto es muy poco optimizado, pero no es probable que incluso una versión optimizada supere a Tim Sort (incorporado en CPython
sort
) porque es realmente rápido . Lo intenté antes y perdí.fuente
sort
fácilmente, o está dispuesto a escribir una extensión C para velocidad, etc.Por supuesto, puede usar funciones integradas, pero si desea crear las suyas propias, puede hacer algo como esto. El truco aquí es usar el operador ~ que cambia el número positivo a negativo. Por ejemplo, ~ 2 -> -3 y el uso de negativo en la lista en Python contará los elementos desde el final. Entonces, si tiene mid == 2, entonces tomará un tercer elemento desde el principio y un tercer elemento desde el final.
fuente
Puede usar el
list.sort
para evitar crear nuevas listassorted
y ordenar las listas en su lugar.Además, no debe usarse
list
como un nombre de variable ya que sombrea la propia lista de Python .fuente
mylist.sort(); middle(mylist)
, pero sin duda es una cuestión de gustos. Solo creo que la mutación en general debería reservarse para métodos en la medida de lo posible. La razón por la que list.sort () devuelve None en lugar de la lista en sí es hacer que el comportamiento sea lo más obvio y claro posible. Ocultar todo en la documentación es como ocultar cosas en letra pequeña.fuente
fuente
Publiqué mi solución en la implementación de Python del algoritmo "mediana de medianas" , que es un poco más rápido que usar sort (). Mi solución usa 15 números por columna, para una velocidad ~ 5N que es más rápida que la velocidad ~ 10N de usar 5 números por columna. La velocidad óptima es ~ 4N, pero podría estar equivocado al respecto.
Por solicitud de Tom en su comentario, agregué mi código aquí, como referencia. Creo que la parte crítica para la velocidad es usar 15 números por columna, en lugar de 5.
fuente
Aquí lo que se me ocurrió durante este ejercicio en Codecademy:
fuente
función mediana
fuente
Tuve algunos problemas con las listas de valores flotantes. Terminé usando un fragmento de código de python3 statistics.median y funciona perfectamente con valores flotantes sin importaciones. fuente
fuente
fuente
Definí una función mediana para una lista de números como
fuente
fuente
mediana de la función:
fuente
En caso de que necesite información adicional sobre la distribución de su lista, el método de percentil probablemente será útil. Y un valor medio corresponde al percentil 50 de una lista:
fuente
Una función simple para devolver la mediana de la lista dada:
si quieres usar la biblioteca, simplemente puedes hacerlo;
fuente
fuente
Un enfoque más generalizado para la mediana (y los percentiles) sería:
fuente
Aquí está la forma tediosa de encontrar la mediana sin usar la
median
función:fuente
Es muy simple;
Y puede usar el valor de retorno de esta manera
median = median(anyList)
fuente
sList
Devuelve la matriz ordenada. No devuelve la mediana