Sin usar declaraciones if-elif, ¿cómo juzgar el rango de un número con elegancia?

Me topé con una pregunta sobre stackoverflow y fue bastante esclarecedora, así que compártala.

La idea principal de la pregunta es: hay 5 niveles de A a F, y ahora es necesario determinar el nivel al que pertenece un cierto valor (entre 0 y 1). Por ejemplo, si el valor> = 0.9, pertenece a A; si el valor> = 0.8, pertenece a B; y así sucesivamente.

Si usa una declaración if-elif, podría escribirse así:

if scr >= 0.9:
    print('A')
elif scr >= 0.8:
    print('B')
elif scr >= 0.7:
    print('C')
elif scr >= 0.6:
    print('D')
else:
    print('F')

Hay muchos patrones repetitivos en este escrito, que no son simples y elegantes. ¿Qué mejor manera de lograr este objetivo?

Hay bastantes respuestas a esta pregunta, y hay muchas formas de lograrlo. Elijo algunas legibilidad es mejor:

Método 1: utilice el bisectmódulo (digital ajustable)

Método 2: Use zip () y next ()

Método 3: use un diccionario (solo para diccionarios ordenados por encima de Python 3.6)

Hay varias otras respuestas, aunque todas pueden lograr el propósito de la calificación digital, pero su legibilidad es mucho peor, porque requieren que haga cálculos y razonamientos, o introducen variables adicionales.

Si está interesado, puede ver todas las respuestas en esta dirección: https://stackoverflow.com/questions/61030617/how-can-i-simplify-repetitive-if-elif-statements

Después de ver todas las respuestas, creo que bisectel método utilizado es el más eficiente y elegante, pero merece la mayor aprobación.

Aquí hay un breve análisis de su proceso de implementación.

bisectEs una biblioteca estándar integrada en Python que implementa un algoritmo de búsqueda binaria. La llamada búsqueda binaria también se llama "Búsqueda binaria". Su idea básica es dividir los n elementos ordenados en dos mitades en promedio, y luego comparar la x que se encuentra con el elemento medio. Si x es menor que el elemento medio , La mitad izquierda se divide en dos, y luego x se compara con su elemento central, y así sucesivamente.

Este es un ejemplo gráfico simple:

bisectEl método bisect () en la biblioteca encuentra el punto de inserción i del elemento x en una secuencia ascendente de modo que los elementos a la izquierda del punto de inserción son todos menores o iguales a x, y los elementos a la derecha del punto de inserción son todos mayores que x.

Contraste con el ejemplo anterior:

from bisect import bisect 

def grade(score, breakpoints=[60, 70, 80, 90], grades='FDCBA'):
     i = bisect(breakpoints, score)
     return grades[i]

Se puede simplificar en dos partes:

  • bisect ([60, 70, 80, 90], score), devuelve el valor del punto de inserción. Si la puntuación es 59, el punto de inserción se calcula a la izquierda de 60, y el valor del índice de la lista de Python comienza con 0, por lo que el valor del punto de inserción se devuelve a 0; si la puntuación es 60, el punto de inserción se calcula a la derecha de 60 Lado, es decir, el valor del índice de retorno es 1.
  • 'FDCBA' [i], devuelve el carácter cuyo valor de índice es i. Si yo es 0, obtenga "F"; si soy 3, obtenga "B" ...

El algoritmo de búsqueda binaria es un algoritmo altamente eficiente con una complejidad temporal de O (logn). El rango de búsqueda de este tema es muy pequeño, por lo que la eficiencia del tiempo no es muy diferente. Pero su escritura se llama Pythonic, vale la pena aprenderla.

Además, mire el método anterior tres (usando un diccionario), que es muy legible, es decir, compare secuencialmente scr con el valor en el diccionario (de mayor a menor, que es 0.9 ~ 0.5), para dibujar el correspondiente Valor clave (PD: tiene una calificación "E" adicional, que se puede quitar)

Si la versión de Python es inferior a 3.6, grade.items () estará fuera de servicio, lo que romperá el orden de comparación. Por compatibilidad, se puede modificar para ordenar (grade.items ()):

Este método no introduce bibliotecas adicionales. Los elementos () y ordenados () utilizados son conocimientos básicos (en comparación con zip () y next () en el método dos). Es simple y práctico, y también es muy recomendable.

En cualquier caso, el uso repetido de sentencias if-elif es incómodo y debe mejorarse. Todas las respuestas enumeradas en el artículo son actualmente aceptadas.

Si un entrevistador lo usa como una pregunta de entrevista, creo que será muy interesante: no es difícil y hay espacio para jugar.

¿Pueden los lectores tener otras ideas? Bienvenido a dejar un mensaje para discutir.

Supongo que te gusta

Origin www.cnblogs.com/pythonista/p/12731600.html
Recomendado
Clasificación