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

如何用Python检查两个含起止值的数组是否存在交集?

判断两个区间是否存在交集的Python实现

手动实现核心逻辑

首先,判断两个区间是否相交的核心逻辑很直观:只要两个区间不是完全分离的,就存在交集。换句话说,当且仅当第一个区间的结束值小于第二个区间的起始值,或者第二个区间的结束值小于第一个区间的起始值时,它们没有交集;其余情况都有交集。

这个逻辑对包含float("inf")(正无穷)或float("-inf")(负无穷)的区间同样适用,因为Python原生支持无穷值与普通数字的比较。

下面是一个简洁的实现函数:

def intervals_intersect(a: tuple[float, float], b: tuple[float, float]) -> bool:
    # 先确保每个区间的起始值 <= 结束值(处理输入可能的顺序错误)
    a_start, a_end = sorted(a)
    b_start, b_end = sorted(b)
    # 核心判断:非分离即相交
    return not (a_end < b_start or b_end < a_start)

测试示例

我们来验证你提到的场景:

import math

# 示例1:两个无穷区间
a = (10, math.inf)
b = (8, math.inf)
print(intervals_intersect(a, b))  # 输出: True

# 示例2:一个区间包含另一个区间
a = (10, 20)
b = (4, 25)
print(intervals_intersect(a, b))  # 输出: True

# 反例:完全分离的区间
a = (1, 5)
b = (6, 10)
print(intervals_intersect(a, b))  # 输出: False

# 边界情况:区间端点接触(这里视为相交,若需要不包含端点可改为<=)
a = (5, 10)
b = (10, 15)
print(intervals_intersect(a, b))  # 输出: True

如果你的场景中端点接触不算交集,只需要把判断条件里的<改成<=即可:

return not (a_end <= b_start or b_end <= a_start)

使用第三方工具库

如果需要处理更复杂的区间操作(比如批量区间管理、合并、查询等),可以使用专门的Python库:

1. intervaltree

这是一个专门用于区间操作的轻量级库,支持交集查询、插入、删除等操作。

首先安装:

pip install intervaltree

使用示例:

from intervaltree import IntervalTree, Interval

# 直接判断两个区间是否相交
a = Interval(10, math.inf)
b = Interval(8, math.inf)
print(a.overlaps(b))  # 输出: True

# 如果是批量区间管理,用区间树更方便
tree = IntervalTree()
tree.add(Interval(10, 20))
# 查询与目标区间相交的所有区间
matches = tree.overlap(Interval(4, 25))
print(bool(matches))  # 输出: True

2. pandas Interval

如果你已经在使用pandas,可以用它的Interval类型来判断重叠,还能灵活控制区间的开闭规则:

import pandas as pd

# closed参数可选'left'/'right'/'both'/'neither',控制是否包含端点
a = pd.Interval(10, math.inf, closed='both')
b = pd.Interval(8, math.inf, closed='both')
print(a.overlaps(b))  # 输出: True

a = pd.Interval(10, 20, closed='left')
b = pd.Interval(4, 25, closed='right')
print(a.overlaps(b))  # 输出: True

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:26:38