Python中如何实现数值区间映射?以AQI等级计算为例
AQI等级映射优化实现方案
方案1:使用内置bisect模块(推荐,易维护+高性能)
Python内置的bisect模块提供了二分查找能力,非常适合这种连续区间映射的场景,不需要写冗余的多分支判断,后续调整阈值也只需要修改分界点列表即可:
import bisect def get_level_of_aqi(aqi): # 校验AQI合法性 if aqi < 0: raise ValueError("AQI数值不能为负数") # AQI区间的上界阈值,按升序排列 breakpoints = [50, 100, 150, 200, 300] # 二分查找得到的插入位置+1直接对应等级 return bisect.bisect_left(breakpoints, aqi) + 1
优势:
- 代码简洁,没有重复的判断逻辑
- 时间复杂度为O(log n),哪怕后续区间数量大幅增加也不会出现性能下降
- 维护成本低,调整区间阈值只需要修改
breakpoints列表,不需要改动逻辑代码 - 完全匹配规则要求:输入100时返回值为2,所有区间映射都符合定义
方案2:区间元组遍历(无依赖,逻辑直观)
如果不想引入额外模块,也可以预定义区间与等级的映射列表,遍历匹配即可,区间数量少的情况下性能差异可以忽略:
def get_level_of_aqi(aqi): if aqi < 0: raise ValueError("AQI数值不能为负数") # 按顺序存储(区间上界, 对应等级),最后用无穷大匹配超过300的情况 level_map = [(50, 1), (100, 2), (150, 3), (200, 4), (300, 5), (float('inf'), 6)] for upper_bound, level in level_map: if aqi <= upper_bound: return level
优势:
- 不需要导入任何依赖,逻辑直白易懂
- 区间与等级的对应关系直接体现在
level_map中,可读性极强
内容的提问来源于stack exchange,提问作者Andy Su
相关产品推荐
相关产品推荐

