合并多个区间
def merge(intervals):
'''
@msg: 合并多个区间
@param intervals {list} 一个二维数组,每一项代表一个区间
@return: {list} 返回合并后的区间列表
'''
intervals = [sorted(x) for x in intervals]
intervals.sort(key=lambda x: x[0])
merged = []
for interval in intervals:
if not merged or merged[-1][1] < interval[0]:
merged.append(interval)
else:
merged[-1][1] = max(merged[-1][1], interval[1])
return merged
判断两个区间的关系
def relation(interval1,interval2):
'''
@msg: 判断两个区间的关系
@param interval1 {list} 第一个区间
@param interval2 {list} 第二个区间
@return: {int} 返回两个区间的关系,0:两个区间相等、1:两个区间相离、2:两个区间相交、3:两个区间为包含关系
'''
min1,max1=sorted(interval1)
min2,max2=sorted(interval2)
if(min1==min2 and max1==max2):return 0
if(max1<min2 or max2<min1):return 1
if(min1<min2<=max1<max2 or min2<min1<=max2<max1):return 2
if(min1<=min2<=max2<=max1 or min2<=min1<=max1<=max2):return 3
某个区间是否被另一个区间包含
def is_in(interval1,interval2):
'''
@msg: 判断某个区间是否被另一个区间包含
@param interval1 {list} 第一个区间
@param interval2 {list} 第二个区间
@return: {bool} interval1被interval2包含返回真,否则返回假
'''
min1,max1=sorted(interval1)
min2,max2=sorted(interval2)
if(min2<=min1<=max1<=max2):return True
else: return False
求多个区间在某个大区间上的补集
def complement(wide,intervals):
'''
@msg: 求多个区间在某个大区间上的补集
@param wide {list} 大区间
@param intervals {list} 多个区间列表
@return: {list} 返回补集区间列表
'''
start,end=wide
front,back=start,start
result=[]
intervals = [sorted(x) for x in intervals]
intervals.sort(key=lambda x: x[0])
for (start1,end1) in intervals:
if start1 > end: break
front=start1
if front>back:result.append([back,front-1])
if end1+1>back: back=end1+1
if back<=end: result.append([back,end])
return(result)
求两个区间的交集
def intersection(interval1,interval2):
'''
@msg: 求两个区间的交集
@param interval1 {list} 第一个区间
@param interval2 {list} 第二个区间
@return: {list} 若两个区间存在交集,则返回交集,否则返回空列表
'''
nums=sorted(interval1+interval2)
if relation(interval1,interval2) != 1:
return [nums[1],nums[2]]
else:return []
参考:Python数值区间处理的几个函数
评论区