Va de modas...

Dado un conjunto, o distribución, de valores se define la moda como el valor (o valores) que más se repite en dicho conjunto.

En este problema te pedimos que calcules la moda de un conjunto de números.

Entrada

La entrada consta de una serie de casos de prueba.

Cada caso comienza con un número que representa el número de valores que tiene el conjunto, que nunca será mayor de 25.000. En la siguiente línea se proporcionan, separados por espacio, los valores de todos los elementos del conjunto. Todos ellos serán números enteros.

La entrada terminará con una serie de 0 valores.

Salida

Para cada caso de prueba se mostrará la moda de la distribución, es decir el número que más se repite.

Se garantiza que ningún caso de prueba contendrá más de una moda, es decir únicamente habrá un valor que aparezca el mayor número de veces.

Entrada de ejemplo

11
1 2 2 3 3 3 4 4 4 4 5
17
1 8 9 6 3 2 1 5 4 7 9 6 3 2 1 4 7
0

Salida de ejemplo

4
1

Solución propuesta

from statistics import mode


def moda(muestras):
    frecuencias = {}
    for muestra in muestras:
        if muestra not in frecuencias.keys():
            frecuencias[muestra] = 1
        else:
            frecuencias[muestra] += 1
    valores = []
    frecuencia_maxima = max(frecuencias.values())
    for clave in frecuencias.keys():
        if frecuencia_maxima == frecuencias[clave]:
            valores.append(clave)
    return valores


if __name__ == '__main__':
    soluciones = []
    tamano_muestra = int(input())
    while tamano_muestra:
        muestras = [int(x) for x in input().split(' ')]
        #  soluciones.append(moda(muestras))
        soluciones.append(mode(muestras))
        tamano_muestra = int(input())
    for solucion in soluciones:
        print(solucion)

Hace dos ejercicios nos enfrentamos a un ejercicio similar, en ese caso era la mediana y ahora es la moda. De modo que procedemos de la misma manera, haciendo uso de la librería statistics.

Sin embargo, para que no sea tan corto este ejercicio, he añadido una función moda que calcula como su nombre indica la moda de una lista de muestras de entrada, con la peculiaridad de que permite que el valor más repetido no sea único, si no varios. Así que lo que devuelve la función es una lista con la moda o modas, según sea única o no.

En cuanto a la función, se ha de destacar que para contar las frecuencias se hace uso de un diccionario, que funciona, pues como cualquier diccionario, con su clave y su valor (en el día a día diríamos, la palabra y su significado o definición). De modo que para acceder a las frencias de un valor, se utiliza como índice dicho valor y no la posición que ocupe como en las listas. Así, de forma bastante cómoda podemos ir contando cuántas veces se repite cada valor.

Por último, haciendo uso del método values() que devulve todos los valores almacenados en nuestro caso las frencuencias, podemos calcular el máximo y así ir comparando para saber qué valor o valores son moda.

Como comento, he intentado darle un pequeño giro al ejercicio y cualquier duda no tenéis más que hacérmela llegar.

Enlace del código

Enlace en aceptaelreto.com

Publicado el 9 de octubre de 2017