给定边界,找到间隔

时间:2012-12-18 22:41:50

标签: python algorithm python-3.x

有这样的清单

[207, 357, 470, 497, 537]

其中每个数字表示一个区间的边界(0隐含在列表的开头),一个pythonic方式找出给定数字的区间{ {1}}属于?

所以间隔是

n

如果0: (0, 207) 1: (208, 357) 2: (358, 497) 3: (498, 537) ,则n=0的相应时间间隔为0n=3602

2 个答案:

答案 0 :(得分:20)

当然使用bisect module

>>> import bisect
>>> lst = [207, 357, 470, 497, 537]
>>> bisect.bisect_left(lst, 0)
0
>>> bisect.bisect_left(lst, 360)
2

该模块使用binary search,这需要一个排序的序列。使用这样的序列,您可以通过在第一个和最后一个中间选择一个索引来将序列分成两半,以查看您需要的值是否为一半。然后继续划分所选的一半,直到找到匹配的插入点。这使得您可以在O(log N)时间内找到长度为N的序列的插入点,即非常快。

答案 1 :(得分:0)

使用 numpynp.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'