Das Ziel ist es, ein Programm zu erstellen, um Punktzahlen von einem '0 zu 1'-System in ein' F zu A'-System umzuwandeln:
- Wenn
score >= 0.9
würde 'A' drucken - Wenn
score >= 0.8
würde 'B' drucken - 0,7, C.
- 0,6, D.
- Und jeder Wert unter diesem Punkt druckt F.
Dies ist der Weg, um es zu erstellen und es funktioniert auf dem Programm, aber es ist etwas repetitiv:
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')
Ich würde gerne wissen, ob es eine Möglichkeit gibt, eine Funktion so zu erstellen, dass sich die zusammengesetzten Anweisungen nicht so oft wiederholen.
Ich bin ein absoluter Anfänger, würde aber etwas in der Art von:
def convertgrade(scr, numgrd, ltrgrd):
if scr >= numgrd:
return ltrgrd
if scr < numgrd:
return ltrgrd
möglich sein?
Die Absicht hier ist, dass wir es später aufrufen können, indem wir nur scr, numbergrade und letter grade als Argumente übergeben:
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')
Wenn es möglich wäre, weniger Argumente zu übergeben, wäre es sogar noch besser.
python
if-statement
dry
Matheus Bezerra Soares
quelle
quelle
Antworten:
Mit dem Halbierungsmodul können Sie eine numerische Tabellensuche durchführen:
quelle
bisect
, die ich zu selten finde.Sie können etwas in diese Richtung tun:
Dies wird
next
mit einem Standardargument für einen Generator über die von erstellten Score-Grade-Paare verwendetzip
. Es ist praktisch das genaue Äquivalent Ihres Loop-Ansatzes.quelle
Sie können jeder Note einen Schwellenwert zuweisen:
quelle
sorted(grades.items())
da die Sortierung von Diktaten nicht garantiert ist.dict
ist a eine unnötig schwere Datenstruktur, da es auf die Reihenfolge ankommt und Sie ohnehin nach Index (Reihenfolge) und nicht nach Schlüssel suchen.grades[int(score*10)/10.0]
, aber dann sollten SieDecimal
als Floats notorisch schlecht benommene Diktatschlüssel verwenden.In diesem speziellen Fall benötigen Sie keine externen Module oder Generatoren. Einige grundlegende Mathematik ist genug (und schneller)!
quelle
Sie können
np.select
aus der Numpy-Bibliothek für mehrere Bedingungen verwenden:quelle
Ich habe eine einfache Idee, um dies zu lösen:
Jetzt,
quelle
Sie können Folgendes verwenden
numpy.searchsorted
, wodurch Sie zusätzlich die Möglichkeit haben, mehrere Ergebnisse in einem einzigen Anruf zu verarbeiten:quelle
Sie haben einen einfachen Fall angegeben. Wenn Ihre Logik jedoch komplizierter wird, benötigen Sie möglicherweise eine Regelengine , um das Chaos zu bewältigen.
Sie können die Sauron Rule Engine ausprobieren oder einige Python Rules Engines von PYPI finden.
quelle
quelle
Sie können auch einen rekursiven Ansatz verwenden:
quelle
Hier sind einige prägnantere und weniger verständliche Ansätze:
Die erste Lösung erfordert die Verwendung der Bodenfunktion aus der
math
Bibliothek.Und wenn Sie aus irgendeinem Grund beim Importieren der
math
Bibliothek gestört werden. Sie könnten eine Problemumgehung für die Bodenfunktion verwenden:Diese sind etwas kompliziert und ich würde davon abraten, sie zu verwenden, es sei denn, Sie verstehen, was los ist. Dies sind spezifische Lösungen, die die Tatsache ausnutzen, dass die Inkremente in Noten 0,1 betragen, was bedeutet, dass die Verwendung eines anderen Inkrements als 0,1 mit dieser Technik wahrscheinlich nicht funktionieren würde. Es gibt auch keine einfache Oberfläche zum Zuordnen von Noten zu Noten. Eine allgemeinere Lösung wie die von dawg mit Bisect ist wahrscheinlich besser geeignet oder die sehr saubere Lösung von schwobaseggl. Ich bin mir nicht sicher, warum ich diese Antwort veröffentliche, aber es ist nur ein Versuch, das Problem ohne Bibliotheken zu lösen (ich versuche nicht zu sagen, dass die Verwendung von Bibliotheken schlecht ist) in einer Zeile, die die Vielseitigkeit von Python demonstriert.
quelle
Sie können ein Diktat verwenden.
Code
Demo
Wenn die Punktzahl tatsächlich zwischen 0 und 1 liegt, multiplizieren Sie zuerst 100 und suchen Sie dann die Punktzahl.
quelle
Hoffe, dass Folgendes helfen könnte: Wenn 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')
quelle
Sie könnten eine Liste mit Zahlen und dann eine Liste mit Noten haben:
Wenn Sie dann eine bestimmte Punktzahl in eine Buchstabennote umwandeln möchten, können Sie Folgendes tun:
Dann wäre Ihr Endergebnis
"B"
.quelle
0.83
der Note zu kommen"B"
. Sie müssten zeigen, wie Sie von der Partitur zum Index gelangenitem
.