2016-11-29 6 views
2

この質問は、ネストされた整数間隔の間隔の比較についてです。Pythonでネストされた整数間隔の評価

簡略化のために、私がの目標範囲と呼ぶ3つの整数の範囲を仮定します。これらの目標範囲は決して重ならないが、異なる長さであってもよい。

> target1 = range(1,10000) 
> target2 = range(10001,20000) 
> target3 = range(20001,25000) 

はまた常に目標範囲のいずれかよりも小さい長さを有していることを、私は試験範囲を呼び出す別の範囲を想定するが、これは、隣接する目標範囲に交差してもよいです。

> test1 = range(900,5000) # entirely in target1 
> test2 = range(9900,10500) # mostly in target2, but crosses into target1 

ターゲットが該当テスト範囲の範囲を特定できますPythonの機能はありますか?試験範囲が隣接する目標範囲と交差する場合、試験範囲の最も大きな割合を占めるその目標範囲のみが与えられる。

> sought_function(test1, [target1, target2, target3]) 
# 1 
> sought_function(test2, [target1, target2, target3]) 
# 2 

EDIT 1

標準のPython関数が存在しない場合には、ネストされた整数間隔のインターバル比較のために、あなたはどのようなコードを使うのでしょうか?以下は、確かに改善されるnested_in_whichという名前の関数のための、素早く厄介なPythonコードです。

def nested_in_which(test, targets): 
    for n, t in enumerate(targets): 
     if test[0] in t and test[-1] in t: 
      return(n) 
     else: 
      if test[0] in t and n < len(targets) and test[-1] in targets[n+1]: 
       return(n+1) # Overlap comparison not yet implemented 
+1

:ここ

はそれをしないいくつかの大まかなコードです。 – TigerhawkT3

+0

@ TigerhawkT3十分に公正。必要なPythonコードを書くときに時間を節約するのに役立つ整数範囲を比較するライブラリ関数をいくつかお勧めしますか? –

答えて

0

あなたは、各範囲を考える場合セット。テストセットとの最も大きな交差点を与えるターゲット範囲が必要です。

したがって、各ターゲットとテストの交差点の長さを計算し、最大交差点のインデックスを返す場合は、必要なものが必要です。いいえ、そのようなビルトインまたは標準ライブラリ関数が存在しない

def which_range(testRange, *targetRanges): 
    testRange = set(testRange) 
    tests = [ (i, len(set(targetRange).intersection(testRange))) for i, targetRange in enumerate(targetRanges) ] 
    return max(tests, key=lambda x: x[1])[0] 



>>> which_range(range(9900,10500), range(1,10000), range(10001,20000), range(20001,25000)) 
1 # the second target range 
>>> which_range(range(900,5000), range(1,10000), range(10001,20000), range(20001,25000)) 
0 # the first target range 
+0

優秀な提案!ただし、コードでは、ユーザーが各テスト範囲を明示的に入力する必要があり、単に範囲のリストを渡すだけではありません。あなたはそれを適応させることができますか? –

+0

@MichaelGruenstaeudlそれは強制しません。 'which_range(testRange、* someIterableOfRanges)'という構文でドキュメントを検索する必要があります。https://docs.python.org/2/tutorial/controlflow.html#arbitrary-argument-lists – Griffin

+0

@ MichaelGruenstaeudl関数のシグネチャをそのようにしたくない場合は、 'targetRanges'の前に' * 'を削除するだけで、アンパックせずにiterableを渡すことができます。 – Griffin

0

ないあなたがやろうとしている必要がありますが、対象範囲に含まれるテストの範囲をかどうかを確認したい場合は、あなたが行うことができますを確認します。

test1[0] in target1 and test1[-1] in target1 
=> True 
+0

私の目的を説明するために質問を更新しました。典型的な操作を行う関数のようです。したがって、私はそのような機能があると思いました。 –

関連する問題