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

Python中如何实现按左闭右开区间匹配的有序键值查询结构?

非重叠左闭右开区间映射实现方案

需求说明

需要存储有序的区间下界与对应值的映射,示例映射规则如下:

区间返回值
[1, 4)"pear"
[4, 7)"banana"
[7, +∞)"orange"

原始字典写法为d = {1: "pear", 4: "banana", 7: "orange"},要求输入任意数值时自动匹配所属区间,返回对应值。
已排查方案:intervalTrees功能过重且支持重叠区间,不符合需求;原生字典不支持区间匹配,无法直接满足要求。

可用实现方案

两种方案的匹配逻辑都基于二分查找,时间复杂度为O(log n),性能足以应对绝大多数场景:

方案1:使用Python标准库bisect(无第三方依赖)

不需要安装额外依赖,适合轻量使用场景:

import bisect

# 存储排序好的(下界, 值)元组
d = [(1, "pear"), (4, "banana"), (7,"orange") ]
# 提取单独的下界列表用于二分查找
keys = [j[0] for j in d]

# 测试用例:输入1-9验证匹配结果
for v in range(1,10):
    print("当前输入值:", v)
    # 二分查找得到第一个大于v的键的索引,减1即为对应区间的下界索引
    i = bisect.bisect(keys, v) - 1
    out = d[i]
    print("匹配结果:", out)
    print("")

方案2:使用SortedDict(适合频繁增删映射的场景)

如果需要经常新增、删除区间映射,可以用第三方库sortedcontainers提供的SortedDict,它会自动维护键的有序性,无需手动同步下界列表:

from sortedcontainers import SortedDict

d2 = SortedDict()
d2[1] = 'pear'
d2[4] = 'banana'
d2[7] = 'orange'

# 测试用例:输入1-9验证匹配结果
for v in range(1,10):
    print("当前输入值:", v)
    i = bisect.bisect(d2.keys(), v) - 1
    j = d2.keys()[i]
    out = d2[j]
    print("匹配结果:", out)
    print("")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 17:24:02