如何在Python中定义特定范围,判断三值是否同属同一大区间与子区间
需求与优化需求
我需要写一个函数,判断三个数值是否属于同一大区间下的特定子区间,如果三个值都在同一个大区间和子区间里,就打印指定信息。
- 用
last3_values变量从DataFrame中获取最近三个历史数值(会实时更新),比如last3_values为200、277、236时,它们都属于百位大区间下的200-299子区间,数值具有相似性。 - 大区间包括百位(100’s)、千位(1000’s)、万位(10000’s)等,对应的子区间如200-299、9000-9999、15000-15999这类。
我借助ChatGPT生成了一个函数,但觉得逻辑繁琐,希望得到更简洁的实现方案。原函数如下:
def get_specific_range(delta_values): abs_delta = abs(delta_values) str_delta = str(abs_delta) length = len(str_delta) # For values in the 10's if length == 1 or (length == 2 and abs_delta < 100): return 0, 99 # The range for 0-99 # For values in the hundreds elif length == 3: prefix = int(str_delta[0]) # Get the hundred's digit return prefix * 100, (prefix + 1) * 100 - 1 # For values in the thousands elif length == 4: prefix = int(str_delta[:2]) # Get the first two digits return prefix * 1000, (prefix + 1) * 1000 - 1 # For values in the ten thousands elif length == 5: prefix = int(str_delta[:3]) # Get the first three digits return prefix * 10000, (prefix + 1) * 10000 - 1 else: return None
简洁版实现方案
可以通过数学计算替代字符串操作,让逻辑更通用,同时减少分支判断:
def get_specific_range(value): abs_val = abs(value) if abs_val < 100: return (0, 99) # 计算区间基数(100、1000、10000...) base = 10 ** (len(str(abs_val)) - 2) * 10 # 计算区间起始值 start = (abs_val // base) * base # 计算区间结束值 end = start + base - 1 return (start, end)
优化说明
- 统一逻辑:不再针对不同位数写单独分支,通过数学计算自动适配百位、千位、万位等所有大区间场景
- 简化操作:仅在计算基数时用一次字符串长度,其余用整数运算完成,效率更高
- 扩展性强:无论数值是十万位还是更高位数,函数都能自动生成对应子区间,无需新增分支
- 逻辑清晰:0-99的情况单独处理,其余情况统一计算
使用示例
# 测试不同数值 print(get_specific_range(277)) # 输出(200, 299) print(get_specific_range(9500)) # 输出(9000, 9999) print(get_specific_range(15600))# 输出(15000, 15999) print(get_specific_range(50)) # 输出(0, 99)
验证三个值是否同区间的逻辑
基于上面的函数,可封装一个验证函数:
def check_same_range(values): if len(values) != 3: return False ranges = [get_specific_range(v) for v in values] # 判断三个值的区间是否完全一致 if all(r == ranges[0] for r in ranges): start, end = ranges[0] print(f"三个数值均属于子区间{start}-{end}") return True return False # 测试 last3_values = [200, 277, 236] check_same_range(last3_values) # 输出:三个数值均属于子区间200-299
内容的提问来源于stack exchange,提问作者Luke Bell
相关产品推荐
相关产品推荐

