find最接近列表中未完全sorting值的项目的索引

作为一个例子,我的名单是:

[25.75443, 26.7803, 25.79099, 24.17642, 24.3526, 22.79056, 20.84866, 19.49222, 18.38086, 18.0358, 16.57819, 15.71255, 14.79059, 13.64154, 13.09409, 12.18347, 11.33447, 10.32184, 9.544922, 8.813385, 8.181152, 6.983734, 6.048035, 5.505096, 4.65799] 

我正在寻找最接近11.5的价值指数。 我尝试了其他方法,如二进制search和bisect_left但他们不工作。

我无法对此数组进行sorting,因为该值的索引将用于类似的数组上以获取该索引处的值。

尝试以下操作:

 min(range(len(a)), key=lambda i: abs(a[i]-11.5)) 

例如:

 >>> a = [25.75443, 26.7803, 25.79099, 24.17642, 24.3526, 22.79056, 20.84866, 19.49222, 18.38086, 18.0358, 16.57819, 15.71255, 14.79059, 13.64154, 13.09409, 12.18347, 11.33447, 10.32184, 9.544922, 8.813385, 8.181152, 6.983734, 6.048035, 5.505096, 4.65799] >>> min(range(len(a)), key=lambda i: abs(a[i]-11.5)) 16 

或者获取索引和值:

 >>> min(enumerate(a), key=lambda x: abs(x[1]-11.5)) (16, 11.33447) 

怎么样:你压缩两个列表,然后sorting结果?

如果你不能sorting数组,那么没有快速的方法来find最接近的项目 – 你必须迭代所有的条目。

有一个解决方法,但它是一个相当的工作:编写一个sortingalgorithm,sorting数组和(同时)更新第二个数组,告诉你这个条目之前 ,数组sorting。

这样,您可以使用二进制search查找最接近的条目的索引,然后使用此索引使用“索引数组”查找原始索引。

[编辑]使用zip() ,这是非常简单的实现:

  array_to_sort = zip( original_array, range(len(original_array)) ) array_to_sort.sort( key=i:i[0] ) 

现在,您可以二进制search该值(使用item[0] )。 item[1]会给你原来的索引。

走槽所有的项目只是线性的。 如果你想sorting的arrays会更糟。

我没有看到保持一个额外的deltax (到目前为止的最小差异)和idx (该元素的索引)的问题,只是循环一次通过列表。

请记住,如果空间不重要,则可以通过创buildsorting索引的辅助列表来sorting任何列表,而无需移动内容。

另外请记住,如果你正在做这个查询一次,那么你将只需要遍历列表中的每个元素O(n)。 (如果多次,那么你可能会想稍后进行sorting以提高效率)

 import numpy as np a = [25.75443, 26.7803, 25.79099, 24.17642, 24.3526, 22.79056, 20.84866, 19.49222, 18.38086, 18.0358, 16.57819, 15.71255, 14.79059, 13.64154, 13.09409, 12.18347, 11.33447, 10.32184, 9.544922, 8.813385, 8.181152, 6.983734, 6.048035, 5.505096, 4.65799] index = np.argmin(np.abs(np.array(a)-11.5)) a[index] # here is your result 

在a已经是数组的情况下,可以省略相应的转换。