Si votre liste n'est pas triée, vous aurez besoin d'une solution en temps linéaire en utilisant abs
+ argmin
:
>>> np.abs(np.array(arr) - 12).argmin()
7
Cependant, si votre liste est triée (ascendante ou descendante), vous pouvez utiliser la recherche binaire pour obtenir une solution en temps sous-linéaire (très rapide) :
# https://ideone.com/aKEpI2 — improved by @user2357112
def binary_search(arr, val):
# val must be in the closed interval between arr[i-1] and arr[i],
# unless one of i-1 or i is beyond the bounds of the array.
i = np.searchsorted(arr, val)
if i == 0:
# Smaller than the smallest element
return i
elif i == len(arr):
# Bigger than the biggest element
return i - 1
elif val - arr[i - 1] <= arr[i] - val:
# At least as close to arr[i - 1] as arr[i]
return i - 1
# Closer to arr[i] than arr[i - 1]
return i
cases = [10, 12, 100, 10.12] # 5, 7, 8, 5
print(*[binary_search(arr, c) for c in cases], sep=',')