L'objectif est de construire un programme pour convertir les scores d'un système «0 à 1» en un système «F à A»:
- Si
score >= 0.9
imprimerait 'A' - Si
score >= 0.8
imprimerait «B» - 0,7, C
- 0,6, D
- Et toute valeur en dessous de ce point, imprimez F
C'est la façon de le construire et cela fonctionne sur le programme, mais c'est un peu répétitif:
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')
Je voudrais savoir s'il existe un moyen de construire une fonction afin que les instructions composées ne soient pas aussi répétitives.
Je suis un débutant total, mais je dirais quelque chose comme:
def convertgrade(scr, numgrd, ltrgrd):
if scr >= numgrd:
return ltrgrd
if scr < numgrd:
return ltrgrd
être possible?
L'intention ici est que plus tard nous pouvons l'appeler en ne passant que les arguments scr, numbergrade et letter grade comme arguments:
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')
S'il était possible de passer moins d'arguments, ce serait encore mieux.
python
if-statement
dry
Matheus Bezerra Soares
la source
la source
Réponses:
Vous pouvez utiliser le module bissect pour effectuer une recherche de table numérique:
la source
bisect
, que je trouve trop rarement utilisé.Vous pouvez faire quelque chose dans ce sens:
Cela utilise
next
avec un argument par défaut sur un générateur sur les paires de notes créées parzip
. C'est pratiquement l'équivalent exact de votre approche en boucle.la source
Vous pouvez attribuer à chaque note une valeur seuil:
la source
sorted(grades.items())
antérieure , vous devriez le faire car les dict ne sont pas garantis pour être triés.dict
est une structure de données inutilement lourde, car c'est l'ordre qui compte, et vous recherchez de toute façon par index (ordre), pas par clé.grades[int(score*10)/10.0]
, mais alors vous devriez les utiliserDecimal
car les flotteurs sont des clés dict notoirement mal comportées.Dans ce cas précis, vous n'avez pas besoin de modules ou de générateurs externes. Un peu de mathématiques de base est suffisant (et plus rapide)!
la source
Vous pouvez utiliser à
np.select
partir de la bibliothèque numpy pour plusieurs conditions:la source
J'ai une idée simple pour résoudre ce problème:
Maintenant,
la source
Vous pouvez utiliser
numpy.searchsorted
, ce qui vous offre également cette belle option de traitement de plusieurs partitions en un seul appel:la source
Vous avez fourni un cas simple. Cependant, si votre logique devient plus compliquée, vous devrez peut-être moteur de règles pour gérer le chaos.
Vous pouvez essayer le moteur de règles Sauron ou trouver des moteurs de règles Python à partir de PYPI.
la source
la source
Vous pouvez également utiliser une approche récursive:
la source
Voici quelques approches plus succinctes et moins compréhensibles:
La première solution nécessite l'utilisation de la fonction étage de la
math
bibliothèque.Et si pour une raison quelconque, l'importation de la
math
bibliothèque vous dérange. Vous pouvez utiliser une solution de contournement pour la fonction étage:Ce sont un peu compliqués et je vous déconseille de les utiliser à moins que vous ne compreniez ce qui se passe. Ce sont des solutions spécifiques qui profitent du fait que les incréments de notes sont de 0,1, ce qui signifie que l'utilisation d'un incrément autre que 0,1 ne fonctionnerait probablement pas avec cette technique. Il n'a pas non plus d'interface simple pour mapper les marques aux notes. Une solution plus générale telle que celle de dawg utilisant bisect est probablement plus appropriée ou la solution très propre de schwobaseggl. Je ne sais pas vraiment pourquoi je poste cette réponse, mais c'est juste une tentative de résoudre le problème sans aucune bibliothèque (je n'essaye pas de dire que l'utilisation des bibliothèques est mauvaise) en une seule ligne démontrant la nature polyvalente de python.
la source
Vous pouvez utiliser un dict.
Code
Démo
Si les scores sont réellement compris entre 0 et 1, multipliez d'abord 100, puis recherchez le score.
la source
J'espère que ce qui suit pourrait aider: si 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') else: print ('F')
la source
Vous pourriez avoir une liste de nombres, puis une liste de notes pour aller avec:
Ensuite, si vous souhaitez convertir un score spécifié en note de lettre, vous pouvez le faire:
Votre score final serait alors
"B"
.la source
0.83
à la note"B"
. Il faudrait montrer comment passer du score à l'indexitem
.