Python 有人知道如何简化这个算法中的无休止的if-elif-else语句吗?
我试图编写一个等级转换器,将数字等级(如88%)更改为字母等级(即B+),但我觉得有一种比使用无休止的elif语句更简单的方法。理想情况下,我希望有一个条件根据范围确定字母,另一个条件根据单独的范围确定是分配+还是-。以下是当前代码:Python 有人知道如何简化这个算法中的无休止的if-elif-else语句吗?,python,if-statement,range,conditional-statements,Python,If Statement,Range,Conditional Statements,我试图编写一个等级转换器,将数字等级(如88%)更改为字母等级(即B+),但我觉得有一种比使用无休止的elif语句更简单的方法。理想情况下,我希望有一个条件根据范围确定字母,另一个条件根据单独的范围确定是分配+还是-。以下是当前代码: def convert_score_to_grade_w_plus_and_minus(score): if score in range(98, 101): return 'A+' elif score in range(93, 98): re
def convert_score_to_grade_w_plus_and_minus(score):
if score in range(98, 101):
return 'A+'
elif score in range(93, 98):
return 'A'
elif score in range(90, 93):
return 'A-'
elif score in range(88, 90):
return 'B+'
elif score in range(83, 88):
return 'B'
elif score in range(80, 83):
return 'B-'
elif score in range(78, 80):
return 'C+'
elif score in range(73, 78):
return 'C'
elif score in range(70, 73):
return 'C-'
elif score in range(68, 70):
return 'D+'
elif score in range(63, 68):
return 'D'
elif score in range(60, 63):
return 'D-'
elif score in range(60):
return 'F'
else:
return 'INVALID SCORE'
您可以将分数存储在元组列表中,然后使用列表理解返回分数匹配的结果
scores = [('A+', 99, 101), ('A', 93, 98), ('A-', 90, 93)]
score = 91
[result[0] for result in scores if score in range(result[1], result[2])][0]
#'A-'
# without range
[result[0] for result in scores if score > result[1] and score < result[2]][0]
得分=[('A+',99,101),('A',93,98),('A-',90,93)]
分数=91
[如果得分在范围内(结果[1],结果[2]),则得分结果为[0]。]
#“A-”
#无射程
[如果分数>结果[1]且分数<结果[2]],则分数中的结果为结果[0][0]
您可以展开“分数”列表,以包含任意多个分数括号
把上面的东西清理一下
def get_grade(score):
scores = [('A+', 99, 101), ('A', 93, 98), ('A-', 90, 93)]
result = [grade for grade, low, high in scores if score > low and score < high]
return result[0] if result else 'Invalid Score'
def get_等级(分数):
分数=[('A+',99,101),('A',93,98),('A-',90,93)]
结果=[如果分数>低,分数<高,则分数为低,分数为高]
如果结果为“无效分数”,则返回结果[0]
有几种方法可以做到这一点,对于如何将一组if语句转换为数据结构的一般情况,LPython的答案是一种很好的方法
但是请注意,您也可以重构原始实现!在你考虑的范围是有序的和排他性的特定情况下,你也可以认为等级代表的不是范围,而是截止值。例如:
def将分数转换为分数加和减(分数):
如果得分>=98:
返回'A+'
elif得分>=93:
返回“A”
elif得分>=90:
返回'A-'
elif得分>=88:
返回“B+”
elif得分>=83:
返回“B”
elif得分>=80:
返回'B-'
elif得分>=78:
返回'C+'
elif得分>=73:
返回“C”
elif分数>=70:
返回'C-'
elif得分>=68:
返回'D+'
elif得分>=63:
返回'D'
elif分数>=60:
返回'D-'
elif分数>=0:
返回“F”
其他:
返回“无效分数”
然后可以简化为:
def将分数转换为分数加和减(分数):
等级U截止值=('A+',98),('A',93),…,('D',63),('D-',60),('F',0))
对于坡度,坡度中的截止线\u截止线:
如果分数>=截止值:
返回等级
返回“无效分数”
def转换分数(分数):
如果分数=8:
后台='+'
elif分数%10>=3和分数%10其他一些答案的一个“问题”是,它将循环通过范围
对象,从而产生更多必要的计算。您可以利用元组解包和遍历列表。还有一个方便的功能,您可以通过0
一次完成比较
def convert_score_to_grade_w_plus_and_minus(score):
grade_ranges = [
(98, 101, 'A+'), (93, 98, 'A'), (90, 93, 'A-'),
(88, 90, 'B+'), (83, 88, 'B'), (80, 83, 'B-'),
(78, 80, 'C+'), (73, 78, 'C'), (70, 73, 'C-'),
(68, 70, 'D+'), (63, 68, 'D'), (60, 63, 'D-'),
(0, 60, 'F'),
]
for lower, upper, grade in grade_ranges:
if lower <= score <= upper:
return grade
return "Invalid Score"
for score in [70, 34, 99, 102]:
print(score, convert_score_to_grade_w_plus_and_minus(score))
# (70, 'C-')
# (34, 'F')
# (99, 'A+')
# (102, 'Invalid Score')
def将分数转换为分数加和减(分数):
等级范围=[
(98,101,"A+",(93,98,"A","90,93,"A-",,
(88,90,B+),(83,88,B),(80,83,B-),,
(78,80,"C+",(73,78,"C","70,73,"C-",,
(68,70,"D+",(63,68,"D","60,63,"D-",,
(0,60,'F'),
]
对于grade_范围内的较低、较高等级:
如果更低
说明:
在99
处,剪辑分数高于99
(如果有效)
在知道a
在ASCII中是65
的情况下查找等级字母
根据分数%10的剩余部分,添加+
,不添加任何内容或-
。如果是F
则不要添加任何内容
您可以使用(范围、字母)元组列表。@Lukeskipschilperort请记住,您不需要使用range()
,我当然不会。
def convert_score_to_grade_w_plus_and_minus(score):
grade_ranges = [
(98, 101, 'A+'), (93, 98, 'A'), (90, 93, 'A-'),
(88, 90, 'B+'), (83, 88, 'B'), (80, 83, 'B-'),
(78, 80, 'C+'), (73, 78, 'C'), (70, 73, 'C-'),
(68, 70, 'D+'), (63, 68, 'D'), (60, 63, 'D-'),
(0, 60, 'F'),
]
for lower, upper, grade in grade_ranges:
if lower <= score <= upper:
return grade
return "Invalid Score"
for score in [70, 34, 99, 102]:
print(score, convert_score_to_grade_w_plus_and_minus(score))
# (70, 'C-')
# (34, 'F')
# (99, 'A+')
# (102, 'Invalid Score')
import math
def convert_score_to_grade_w_plus_and_minus(score):
if score > 100:
return 'INVALID SCORE'
score = 99 if score > 99 else score
letter = chr(9 - math.floor(score / 10) + 65) if score >= 60 else 'F'
return letter + ('+' if score % 10 >= 8 and not letter == 'F' else ('' if score % 10 >= 3 or letter == 'F' else '-'))