このようなリストを持っている
[207, 357, 470, 497, 537]
ここで、各数値は区間の境界を示します(0
リストの先頭に暗黙的に示されています)。特定の数値がどの区間に属しているかを調べるためのPythonの方法は何ですか。n
したがって、間隔は
0: (0, 207)
1: (208, 357)
2: (358, 497)
3: (498, 537)
の場合n=0
、対応する間隔は0
、の場合n=360
、2
です。
このようなリストを持っている
[207, 357, 470, 497, 537]
ここで、各数値は区間の境界を示します(0
リストの先頭に暗黙的に示されています)。特定の数値がどの区間に属しているかを調べるためのPythonの方法は何ですか。n
したがって、間隔は
0: (0, 207)
1: (208, 357)
2: (358, 497)
3: (498, 537)
の場合n=0
、対応する間隔は0
、の場合n=360
、2
です。
bisect
もちろんモジュールの使用:
>>> import bisect
>>> lst = [207, 357, 470, 497, 537]
>>> bisect.bisect_left(lst, 0)
0
>>> bisect.bisect_left(lst, 360)
2
モジュールはバイナリ検索を使用しますが、これにはソートされたシーケンスが必要です。このようなシーケンスでは、最初と最後の中間のインデックスを選択してシーケンスを半分に分割し、必要な値がどちらかの半分にあるかどうかを確認できます。次に、一致する挿入ポイントが見つかるまで、選択した半分を分割し続けます。これにより、長さNのシーケンスのO(log N)時間で挿入ポイントを見つけることができます。つまり、非常に高速です。
使用numpy
およびnp.searchsorted:
import numpy as np
intervals = [207, 357, 497, 537]
values = [0, 207, 300, 500, 9999]
np.searchsorted(intervals, values)
これは与える:
>>> array([0, 0, 1, 3, 4])
(値が代わりに間隔に207
属することを意図していた場合は、使用できます)1
side='right'