You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效判断指定值在有序区间列表中的所属区间?

高效判断值所属有序区间的实现方法

问题描述

给定有序区间列表(如interval = [-5, -2, 0, 10],对应三个左开右闭区间:(-5, -2]、(-2, 0]、(0, 10]),需判断给定值属于哪个区间,输出布尔数组(仅对应区间为True,其余为False)。已知待检查值一定处于区间列表的最小值与最大值之间,当前循环遍历的方法在处理长列表时速度较慢,需更高效的实现方案。

最优解决方案:二分查找(内置bisect模块)

利用Python内置的bisect模块做二分查找,时间复杂度为O(log n),远优于遍历的O(n),尤其适合超长区间列表场景。

实现代码

import bisect

value = 1
interval = [-5, -2, 0, 10]

# 找到第一个大于value的区间端点索引,减1得到目标区间的下标
target_idx = bisect.bisect_right(interval, value) - 1

# 构造结果数组:仅目标区间设为True
output = [False] * (len(interval) - 1)
output[target_idx] = True

print(output)  # 输出: [False, False, True]

原理说明

  1. bisect.bisect_right(interval, value)返回值插入区间列表后仍保持有序的位置,这个位置减1正好对应值所在的左开右闭区间下标。比如value=1时,插入位置是3(在0和10之间),减1后得到2,对应第三个区间。
  2. 直接构造全False数组,再将目标下标设为True,避免了遍历所有区间的冗余操作。

备选方案:numpy数值加速(适合批量计算场景)

如果处理大量数值或依赖numpy环境,可使用numpy.digitize实现:

import numpy as np

value = 1
interval = [-5, -2, 0, 10]

# digitize返回区间索引(从1开始),减1转为数组下标
target_idx = np.digitize(value, interval) - 1
output = np.zeros(len(interval)-1, dtype=bool)
output[target_idx] = True

print(output.tolist())  # 输出: [False, False, True]

内容的提问来源于stack exchange,提问作者crazydecibel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 18:52:21