如何简化这段多分支if条件判断代码块?
简化多分支if条件判断的方案
方法1:使用区间映射列表遍历
把阈值和对应的F值整理成有序元组列表,遍历即可匹配对应区间,代码简洁且易维护:
# 按区间上限从小到大排列的映射列表 thresholds = [ (1.0, 1.23), (1.05, 1.24), (1.1, 1.25), (1.12, 1.26), (1.16, 1.27), (1.19, 1.28), (1.21, 1.29), (1.24, 1.3), (1.28, 1.31), (1.32, 1.32), (1.37, 1.34), (1.43, 1.35), (1.51, 1.37), (1.62, 1.39), (1.78, 1.42), (2.06, 1.45), (2.74, 1.49) ] F = None for upper, val in thresholds: if ro <= upper: F = val break # 可选:处理ro超过最大阈值的情况 if F is None: # 此处可设置默认值或自定义逻辑 pass
方法2:使用bisect模块实现高效查找
由于阈值是严格递增的,用bisect的二分查找能快速定位区间,适合区间数量较多的场景:
import bisect # 提取阈值上限和对应F值的独立列表 upper_limits = [1.0, 1.05, 1.1, 1.12, 1.16, 1.19, 1.21, 1.24, 1.28, 1.32, 1.37, 1.43, 1.51, 1.62, 1.78, 2.06, 2.74] f_values = [1.23, 1.24, 1.25, 1.26, 1.27, 1.28, 1.29, 1.3, 1.31, 1.32, 1.34, 1.35, 1.37, 1.39, 1.42, 1.45, 1.49] # 找到第一个大于ro的阈值索引,前一个索引即为目标区间 index = bisect.bisect_right(upper_limits, ro) if index > 0: F = f_values[index - 1] else: # ro小于所有阈值的边界情况(此处实际不会触发,因第一个阈值已覆盖ro<=1) F = f_values[0] # 可选:处理ro超过最大阈值的情况 if index == len(upper_limits): # 此处可设置默认值或自定义逻辑 pass
两种方法对比
- 方法1:无需额外导入模块,逻辑直观,适合区间数量少的场景,维护时仅需修改映射列表。
- 方法2:时间复杂度为O(logn),比遍历的O(n)更高效,区间数量多时优势显著。
内容的提问来源于stack exchange,提问作者Максим Александров
相关产品推荐
相关产品推荐

