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

Get intersection range of two non-discrete 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

问题:我是否遗漏了什么,是否有任何内置解决方案或包可以做类似的事情,因为我想让我的代码尽可能简单和快速?

你把事情搞得太复杂了,一个简单的函数是:

def interval_intersect(a,b):
    a0,a1 = a
    b0,b1 = b
    return max(0,min(a1,b1)-max(a0,b0))

我们简单地计算两个间隔开始的最大值和这些间隔之间结束的最小值。然后我们计算差值,用max(0,...)确保如果没有区间,我们会return0.

我们可以将函数进一步概括为:

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

你可以这样做,

max(0, min(range1[1], range2[1]) - max(range1[0], range2[0]))