Python实现筛选未落在指定浮点数扩展区间内的数值
问题排查
你写的代码核心问题出在两层循环的逻辑上:
- 每遍历一个区间就重新生成一次
0~15步长0.5的序列,产生大量冗余计算 - 只要当前值不在当前遍历的单个区间就加入结果,没有判断是否落在其他区间里,最终结果会混入大量错误值
实现思路
正确的逻辑可以拆分三步完成:
- 提前计算所有需要校验的区间,避免边遍历边生成
- 仅生成一次待校验的0~15步长0.5的序列
- 对每个待校验值,确认它不落在所有区间内再加入结果
代码实现
基础Python版本(易理解,适合新手)
values = [2.3, 6.4, 11.3] delta = 2 # 第一步:生成所有区间 intervals = [(x - delta, x + delta) for x in values] # 第二步:生成所有待校验的数值 candidates = [i * 0.5 for i in range(int(15 / 0.5))] # 第三步:逐个校验是否不落在所有区间内 not_in_range = [] for y in candidates: is_in_any_interval = False for low, high in intervals: if low <= y <= high: is_in_any_interval = True break if not is_in_any_interval: not_in_range.append(y) print(not_in_range) # 输出:[0.0, 8.5, 9.0, 13.5, 14.0, 14.5],和预期一致
Numpy版本(更简洁高效,适合数据量较大的场景)
import numpy as np values = np.array([2.3, 6.4, 11.3]) delta = 2 # 生成所有区间的上下限矩阵 intervals = np.column_stack([values - delta, values + delta]) # 生成待校验序列 candidates = np.arange(0, 15, 0.5) # 向量化判断每个值是否落在任意区间内 in_any_interval = np.any((candidates[:, None] >= intervals[:, 0]) & (candidates[:, None] <= intervals[:, 1]), axis=1) # 筛选出不落在任何区间的数值 not_in_range = candidates[~in_any_interval].tolist() print(not_in_range)
内容的提问来源于stack exchange,提问作者pariskey
相关产品推荐
相关产品推荐

