基于整数数值分组,如何替换多if elif语句实现字母等级赋值
方案1:使用bisect模块(最简洁推荐)
bisect是Python标准库内置的二分查找模块,刚好适配这类区间匹配场景,只需要提前定义好分数阈值和对应等级的映射即可:
import bisect # 以下两个序列可以定义为类变量,所有实例共享,无需重复初始化 score_thresholds = [25, 50, 70, 80, 90] grade_levels = ['f', 'e', 'd', 'c', 'b', 'a'] # 等级赋值核心逻辑仅需一行 self.g = grade_levels[bisect.bisect_left(score_thresholds, self.x)]
这个方案的优势:
- 代码量极精简,没有冗余的分支判断
- 后续调整分数阈值、等级规则时,只需要修改两个序列的内容,不需要调整逻辑代码
- 底层是二分查找实现,就算后续区间数量大幅增加,性能也远高于逐层if判断
方案2:无额外依赖的遍历匹配方案
如果不想导入额外模块,可以把阈值和等级打包成规则元组遍历判断,比零散的if/elif易维护很多:
# 规则集可以定义为类变量,统一维护 grade_rules = ( (25, 'f'), (50, 'e'), (70, 'd'), (80, 'c'), (90, 'b'), (101, 'a'), # 由于x最大为100,最后阈值设为101即可覆盖原else分支场景 ) for threshold, grade in grade_rules: if self.x < threshold: self.g = grade break
这个方案的优势:
- 不需要导入任何模块,纯原生语法实现
- 所有规则集中在
grade_rules里,修改调整非常直观,不容易出现判断条件写错的问题
补充:如果可以保证x的取值一定在[0,100]范围内,两个方案都不需要额外加边界校验;如果存在越界可能,只需要在赋值前加一行范围判断即可。
内容的提问来源于stack exchange,提问作者LegendWK
相关产品推荐
相关产品推荐

