2017-07-25 87 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]))