Python 中更優(yōu)雅的范圍判斷

問題

一個常見的問題,班里的成績分為 A、B、C、D、E 五等,分別對應 100-90 分,89-80 分,79-70 分,69-60 分,60 分以下。現(xiàn)在我們得到的數(shù)據(jù)是 66、33 等這樣的數(shù)值,要根據(jù)數(shù)值找到對應的等級,通常情況下,我們會這樣寫:

def get_grade(score):
    if 90 <= score <= 100:
        return 'A'
    elif 80 <= score < 90:
        return 'B'
    elif 70 <= score < 80:
        return 'C'
    elif 60 <= score < 70:
        return 'D'
    elif score < 60:
        return 'E'

問題是,這樣寫代碼會顯得太丑陋了。那么,有沒有更好的方法呢?

解決方案

標準庫的 bisect 模塊提供了一個很好的方法可以為此提供更為優(yōu)雅的解決方案:bisect(),示例如下:

from bisect import bisect

breakpoints = 60, 70, 80, 90
grades = 'EDCBA'


def get_grade(score):
    return grades[bisect(breakpoints, score)]

來試試效果:

>>> [get_grade(s) for s in [33, 55, 66, 99]]
['E', 'E', 'D', 'A']

結果正如預期。

擴展

  • bisect.bisect(a, x, lo=0, hi=len(a)) 返回的插入點 i 將數(shù)組 a 分成兩半,使得左半邊為 all(val <= x for val in a[lo : i]) 而右半邊為 all(val > x for val in a[i : hi])
  • bisect 正如其名稱一樣,使用了二分算法,二分法對于搜索一定范圍的值是很高效的。 對于定位特定的值,則字典的性能更好,比如考慮根據(jù)等級獲取對應的數(shù)值范圍,使用下面的代碼更為高效:
grades_scale = {'A': (90, 100),
                'B': (80, 89),
                'C': (70, 79),
                'D': (60, 69),
                'E': (0, 59)}


def get_scale(grade):
    """獲取等級對應的成績范圍"""
    return grades_scale[grade]
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容