2017-07-25 90 views
2

给定由起始点和终点(两个浮点数)定义的间隔,我想确定第二个间隔的交集范围。例如:获取两个非离散间隔的交集范围

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 

问:我错过了一些东西,在那里,做类似的,因为要保持我的代码一样简单和尽快任何东西积聚在溶液中或包装?

回答

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

谢谢!这实际上正是我的第一种情况的“return”声明,但是我以某种方式试图努力并且没有意识到这已经处理了所有可能性......'+ 1'用于多个间隔的解决方案 –

1

你能做到这一点,

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