如何高效检查元素是否在引用列表的范围内并获取索引引用列表?
这个想法是检查列表中的每个元素(即,data_list)是否在引用列表(即,range_list)的范围内。如果它在引用列表中,则提取range_list它出现在引用列表 ( ) 的哪个索引处。
起草了以下代码。
lst=range(0,1000,1)
n=6
range_list=[lst [i:i + n] for i in range ( 0, len ( lst ), n )]
data_list=[1,2,5,6,8,10,12,100, 102, 104, 105]
idx_un=[]
for x in data_list:
for idx,y in enumerate(range_list):
if min(y)<= x <= max ( y ):
idx_un.append(idx)
break
输出:
[0, 0, 0, 1, 1, 1, 2, 16, 17, 17, 17]
但我很好奇是否存在更紧凑和有效的方法。
回答
由于您的范围基本上是整数的分区,因此您实际上并不需要范围列表。您可以只使用范围的起始编号列表。一旦你这样做,你可以可以使用该bisect模块获得极快的二进制搜索业务-速度更快和更简单的(假设它符合你的使用情况)。这会给你留下类似的东西:
import bisect
range_list = list(range(n,1000, n))
data_list=[1,2,5,6,8,10,12,100, 102, 104, 105]
[bisect.bisect_right(range_list, n) for n in data_list]
# [0, 0, 0, 1, 1, 1, 2, 16, 17, 17, 17]