获得两个非离散区间的交集范围

时间:2017-07-25 14:29:19

标签: python intervals

给定由起点和终点(两个浮点数)定义的间隔,我想确定具有第二个间隔的交点范围。例如:

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

问题:我是否遗漏了某些东西,是否有任何类似的内置解决方案或软件包,因为我希望尽可能简单快速地保存代码?

2 个答案:

答案 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]))