python - 一种优雅、更短的方式来解决字母等级分配问题

标签 python

<分区>

我是 Python 的新手,想学习最优化的编码方式。我正在做将字母等级分配给数字等级的经典介绍问题;我已经了解链接一堆 elif 的简单方法,但是有没有更优化的方法?如果说我有更多的子等级,或者以后我需要更改每个字母等级的标准怎么办?有没有办法为一系列值创建类似于字典的东西?

这就是问题所在:

Write a function named letter_grade that takes an integer argument, which represents a mark of a student. Return ‘A’ if mark ≥ 90, ‘B’ if 80 ≤ mark < 90, ‘C’ if 70 ≤ mark < 80, ‘D’ if 60 ≤ mark < 70, and ‘E’ if mark < 60. Return None if it is not a valid mark. A valid mark ranges from 0 to 100.

所以我们学到的基本蛮力方法很简单:

def letter_grade(mark):
    if mark >100:
        grade = None
    elif mark >=90:
        grade = 'A'
    elif mark >= 80:
        grade = 'B'
    elif mark >= 70:
        grade = 'C'
    elif mark >= 60:
        grade = 'D'
    elif mark >= 0:
        grade = 'E'
    else:
        grade = None
    return grade

但是现在假设我有更多的子等级,比如 A+、A、A- 等一直到 F。我不想为此将 20+ elif 链接在一起.我想知道是否有更短的方法来处理这个问题。

最佳答案

您可以在表示成绩截止分数的元组列表上使用带有条件的 next:

grades = ((100, None), (90, 'A'), (80, 'B'), (70, 'C'), (60, 'D'), (0, 'E'))
def get_grade(mark):
    return next((grade for score, grade in grades if mark >= score), None)

>>> get_grade(15)
'E'
>>> get_grade(75)
'C'
>>> get_grade(95)
'A'

(100, None) 和默认的 None 适用于大于 100 或小于 0 的分数。

或者没那么短,但恕我直言更好,有范围检查并引发适当的异常:

grades = ((90, 'A'), (80, 'B'), (70, 'C'), (60, 'D'), (0, 'E'))
def get_grade(mark):
    if 0 <= mark <= 100:
        return next(grade for score, grade in grades if mark >= score)
    raise ValueError("Mark must be between 0 and 100")

虽然这将遍历所有可能的等级直到找到正确的等级,但考虑到等级的数量非常少且恒定,这仍然可以被认为是 O(1)。如果等级/间隔的数量要高得多,您可以考虑使用 bisect 对正确的间隔进行二进制搜索,正如现在链接的一些答案中所见,但这有点不直观很容易出现令人讨厌的逐一错误。

关于python - 一种优雅、更短的方式来解决字母等级分配问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54504630/

相关文章:

python - 如何每隔一段时间发送文件?

python - 写入格式化文件

python - 对 csr 格式的 scipy 稀疏矩阵中的行的操作

python - Django:使用 simple-history 模块我得到 auth_historicaluser 不存在错误

python - 对值递减的列表运行 for 循环

python - 在 Python 中使用学术模块进行搜索查询期间停止迭代

python - 这是依赖注入(inject)和/或单例模式吗?

python - 如何在 TensorFlow 中操作符号张量

python - 如何以毫秒为单位使用 time.sleep()

python - 我想使用 matplotlib 绘制数据图表,但它显示 float() : 2014-12-10 的无效文字