11

このようなリストを持っている

[207, 357, 470, 497, 537]

ここで、各数値は区間の境界を示します(0リストの先頭に暗黙的に示されています)。特定の数値がどの区間に属しているかを調べるためのPythonの方法は何ですか。n

したがって、間隔は

0: (0, 207)
1: (208, 357)
2: (358, 497)
3: (498, 537)

の場合n=0、対応する間隔は0、の場合n=3602です。

4

2 に答える 2

24

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)時間で挿入ポイントを見つけることができます。つまり、非常に高速です。

于 2012-12-18T22:44:19.220 に答える
1

使用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属することを意図していた場合は、使用できます)1side='right'

于 2021-06-11T10:36:24.913 に答える