El objetivo es crear un programa para convertir puntajes de un sistema '0 a 1' a un sistema 'F a A':
- Si
score >= 0.9
imprimiera 'A' - Si
score >= 0.8
imprimiría 'B' - 0.7, C
- 0.6, D
- Y cualquier valor por debajo de ese punto, imprima F
Esta es la forma de construirlo y funciona en el programa, pero es algo repetitivo:
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')
Me gustaría saber si hay una manera de construir una función para que las declaraciones compuestas no sean tan repetitivas.
Soy un principiante total, pero haría algo en las líneas de:
def convertgrade(scr, numgrd, ltrgrd):
if scr >= numgrd:
return ltrgrd
if scr < numgrd:
return ltrgrd
¿ser posible?
La intención aquí es que luego podamos llamarlo pasando solo el scr, el grado de calificación y la calificación de letra como argumentos:
convertgrade(scr, 0.9, 'A')
convertgrade(scr, 0.8, 'B')
convertgrade(scr, 0.7, 'C')
convertgrade(scr, 0.6, 'D')
convertgrade(scr, 0.6, 'F')
Si fuera posible pasar menos argumentos, sería aún mejor.
python
if-statement
dry
Matheus Bezerra Soares
fuente
fuente
Respuestas:
Puede usar el módulo bisect para hacer una búsqueda de tabla numérica:
fuente
bisect
, que considero que se usa muy raramente.Puedes hacer algo en este sentido:
Esto se usa
next
con un argumento predeterminado en un generador sobre los pares de calificación-calificación creados porzip
. Es prácticamente el equivalente exacto de su enfoque de bucle.fuente
Puede asignar a cada calificación un valor umbral:
fuente
sorted(grades.items())
ya que no se garantiza que los dictados estén ordenados.dict
es una estructura de datos innecesariamente pesada, ya que es el orden lo que importa, y de todos modos está buscando por índice (orden), no por clave.grades[int(score*10)/10.0]
, pero luego deberías usarlosDecimal
como flotantes que son notoriamente noticiosas.En este caso específico, no necesita módulos externos o generadores. ¡Algunas matemáticas básicas son suficientes (y más rápidas)!
fuente
Puede usar
np.select
de la biblioteca numpy para múltiples condiciones:fuente
Tengo una idea simple para resolver esto:
Ahora,
fuente
Podrías usar
numpy.searchsorted
, lo que además te brinda esta buena opción de procesar múltiples puntajes en una sola llamada:fuente
Usted proporcionó un caso simple. Sin embargo, si su lógica se está volviendo más complicada, es posible que necesite un motor de reglas para manejar el caos.
Puede probar el motor de reglas de Sauron o encontrar algunos motores de reglas de Python en PYPI.
fuente
fuente
También podría usar un enfoque recursivo:
fuente
Aquí hay algunos enfoques más concisos y menos comprensibles:
La primera solución requiere el uso de la función de piso de la
math
biblioteca.Y si por alguna razón importar la
math
biblioteca te está molestando. Podría usar una solución alternativa para la función de piso:Estos son un poco complicados y recomendaría no usarlos a menos que entiendas lo que está sucediendo. Son soluciones específicas que aprovechan el hecho de que los incrementos en las calificaciones son 0.1, lo que significa que usar un incremento diferente a 0.1 probablemente no funcionaría usando esta técnica. Tampoco tiene una interfaz fácil para asignar marcas a calificaciones. Una solución más general como la de dawg usando bisect es probablemente la solución más limpia o más adecuada de schwobaseggl. No estoy realmente seguro de por qué estoy publicando esta respuesta, pero es solo un intento de resolver el problema sin ninguna biblioteca (no estoy tratando de decir que usar bibliotecas es malo) en una línea que demuestra la naturaleza versátil de Python.
fuente
Puedes usar un dict.
Código
Manifestación
Si los puntajes están realmente entre 0 y 1, primero multiplique 100, luego busque el puntaje.
fuente
Espero que lo siguiente pueda ayudar: if scr> = 0.9: print ('A') elif 0.9> scr> = 0.8: print ('B') elif 0.8> scr> = 0.7: Print ('C') elif 0.7 scr> = 0.6: print ('D') más: print ('F')
fuente
Podría tener una lista de números, luego una lista de calificaciones para acompañarla:
Luego, si desea convertir una puntuación especificada en una calificación de letra, puede hacer esto:
Entonces tu puntaje final sería
"B"
.fuente
0.83
a la calificación"B"
. Tendría que mostrar cómo pasar de la puntuación al índiceitem
.