2017-07-25 24 views
2

開始点と終了点(両方の浮動小数点数)によって定義される間隔が与えられたら、第2の間隔で交差範囲を決定したいと思います。たとえば、: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)) 

私たちは、単に2つの間隔の開始の最大値とこれらの間隔の間に終了の最小値を計算します。それは、任意の数で動作させるために

from operator import itemgetter 

def interval_intersect(*args): 
    return max(0,min(map(itemgetter(1),args))-max(map(itemgetter(0),args))) 

:私たちは、その後、0

私たちは、にさらに機能を一般化することができますの差を計算し、何の間隔が存在しない場合、我々は返されることを確認するmax(0,...)を使用します間隔の。これらの両方与える:

>>> interval_intersect((2,5),(2.2,7)) 
2.8 
+1

感謝を!これは実際に私の最初のケースの 'return'ステートメントですが、私は何とか頑張ろうとしていましたが、これはすでにすべての可能性を処理していることに気付かなかった...複数の間隔 –

1

あなたがこれを行うことができ、

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

関連する問題