给定由起点和终点(两个浮点数)定义的间隔,我想确定具有第二个间隔的交点范围。例如:
int1 = [2. , 5.]
int2 = [2.2, 7.]
>>> desired_function(int1, int2)
2.8
它应该处理所有交叉点可能性(没有交叉点,部分交叉点,完整交叉点,也是负范围等)。我的尝试看起来像这样:
def intersection(int1, int2):
#case 1: partial intersection over the left or right border
if (int2[0]<=int1[0] and int2[1]<=int1[1]) or (int2[0]>=int1[0] and int2[1]>=int1[1]):
return min(int1[1],int2[1]) - max(int1[0],int2[0])
#case 2: complete overlap of one interval by the other
elif (int2[0]>=int1[0] and int2[1]<=int1[1]) or (int2[0]<=int1[0] and int2[1]>=int1[1]):
return min (int2[1]-int2[0] , int1[1]-int1[0])
#case 3: no overlap at all
else:
return 0
问题:我是否遗漏了某些东西,是否有任何类似的内置解决方案或软件包,因为我希望尽可能简单快速地保存代码?
答案 0 :(得分:3)
你使事情变得太复杂,这样做的一个简单功能是:
def interval_intersect(a,b):
a0,a1 = a
b0,b1 = b
return max(0,min(a1,b1)-max(a0,b0))
我们只计算两个区间的起点的最大值和这些区间之间的最小值。然后我们计算差异并使用max(0,...)
来确保如果没有间隔,我们将返回0.
我们可以将功能进一步概括为:
from operator import itemgetter
def interval_intersect(*args):
return max(0,min(map(itemgetter(1),args))-max(map(itemgetter(0),args)))
让它以任意数量的间隔工作。这些都给出了:
>>> interval_intersect((2,5),(2.2,7))
2.8
答案 1 :(得分:1)
你可以这样做,
max(0, min(range1[1], range2[1]) - max(range1[0], range2[0]))