問(wèn)題
一個(gè)常見(jiàn)的問(wèn)題空厌,班里的成績(jī)分為 A庐船、B、C嘲更、D筐钟、E 五等,分別對(duì)應(yīng) 100-90 分赋朦,89-80 分篓冲,79-70 分,69-60 分宠哄,60 分以下∫冀現(xiàn)在我們得到的數(shù)據(jù)是 66、33 等這樣的數(shù)值毛嫉,要根據(jù)數(shù)值找到對(duì)應(yīng)的等級(jí)诽俯,通常情況下,我們會(huì)這樣寫:
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'
問(wèn)題是承粤,這樣寫代碼會(huì)顯得太丑陋了暴区。那么,有沒(méi)有更好的方法呢辛臊?
解決方案
標(biāo)準(zhǔn)庫(kù)的 bisect 模塊提供了一個(gè)很好的方法可以為此提供更為優(yōu)雅的解決方案:bisect()
仙粱,示例如下:
from bisect import bisect
breakpoints = 60, 70, 80, 90
grades = 'EDCBA'
def get_grade(score):
return grades[bisect(breakpoints, score)]
來(lái)試試效果:
>>> [get_grade(s) for s in [33, 55, 66, 99]]
['E', 'E', 'D', 'A']
結(jié)果正如預(yù)期。
擴(kuò)展
-
bisect.bisect(a, x, lo=0, hi=len(a))
返回的插入點(diǎn)i
將數(shù)組a
分成兩半彻舰,使得左半邊為all(val <= x for val in a[lo : i])
而右半邊為all(val > x for val in a[i : hi])
-
bisect
正如其名稱一樣伐割,使用了二分算法,二分法對(duì)于搜索一定范圍的值是很高效的淹遵。 對(duì)于定位特定的值口猜,則字典的性能更好负溪,比如考慮根據(jù)等級(jí)獲取對(duì)應(yīng)的數(shù)值范圍透揣,使用下面的代碼更為高效:
grades_scale = {'A': (90, 100),
'B': (80, 89),
'C': (70, 79),
'D': (60, 69),
'E': (0, 59)}
def get_scale(grade):
"""獲取等級(jí)對(duì)應(yīng)的成績(jī)范圍"""
return grades_scale[grade]