如何用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
相关产品推荐
相关产品推荐

