如何用Lookup或HashMap替代多分支if-else语句?
移除多分支条件判断实现利润评级计算
这里提供两种无需if/elif/else的实现方式,完全贴合你原代码的逻辑:
方法一:整数除法 + 边界限制
利用整数除法的特性直接计算评级,代码简洁高效:
# 计算基础评级 profit_rating = (Profit + 9999) // 10000 # 确保评级不超过10(对应原else分支) profit_rating = min(profit_rating, 10) print(f'Profit Rating is {profit_rating}')
原理说明
通过给Profit加上9999,把每个区间的起始值对齐到10000的整数倍:
- 当
Profit ≤10000时,(Profit+9999)的范围是9999~19999,整数除以10000结果为1 - 当
10001≤Profit≤20000时,(Profit+9999)的范围是20000~29999,整数除以10000结果为2 - 以此类推,直到
80001≤Profit≤90000时结果为9 - 当
Profit>90000时,计算结果会≥10,用min()函数限制为10,和原代码的else分支逻辑一致
方法二:bisect模块实现区间查找
如果后续需要调整阈值,这种方式更易维护:
import bisect # 定义各评级对应的阈值和评级列表 thresholds = [10000, 20000, 30000, 40000, 50000, 60000, 70000, 80000, 90000] ratings = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 查找对应评级 profit_rating = ratings[bisect.bisect_right(thresholds, Profit)] print(f'Profit Rating is {profit_rating}')
原理说明
bisect.bisect_right()会返回Profit在thresholds列表中应该插入的位置,这个位置刚好对应ratings列表的索引:
Profit ≤10000时,插入位置为0,对应ratings[0]=110001≤Profit≤20000时,插入位置为1,对应ratings[1]=2Profit>90000时,插入位置为9,对应ratings[9]=10,完全匹配原代码的分支逻辑
内容的提问来源于stack exchange,提问作者Akash
相关产品推荐
相关产品推荐

