有这样的清单
[207, 357, 470, 497, 537]
其中每个数字表示一个区间的边界(0
隐含在列表的开头),找出给定数字属于哪个区间的pythonic方法是什么?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
隐含在列表的开头),找出给定数字属于哪个区间的pythonic方法是什么?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
该模块使用二进制搜索,这需要一个排序的序列。使用这样的序列,您可以通过在第一个和最后一个之间的中间选择一个索引来将序列分成两半,以查看您需要的值是否在任何一半中。然后继续分割选定的一半,直到找到匹配的插入点。这使您可以在 O(log N) 时间内找到长度为 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'
则可以使用)