Python 有人知道如何简化这个算法中的无休止的if-elif-else语句吗?

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

我试图编写一个等级转换器,将数字等级(如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):
     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 '-'))