python:从整数列表(数组)中获取最接近给定值的数字
---------------------------------2020.12.9更新-----------------------------------
简化了 bisect_left
def takeClosest(myList, myNumber):
if (myNumber >= myList[-1]):
return myList[-1]
elif myNumber <= myList[0]:
return myList[0]
pos = bisect_left(myList, myNumber) # 找到 mylist 里面第一个不比 mynumber 小(即 >= )的数的索引下标
# 返回的插入点 pos 可以将数组myList分成两部分。左侧是 all(val < x for val in myList[lo:i]) ,右侧是 all(val >= x for val in myList[i:hi])
before = myList[pos - 1]
after = myList[pos]
if after - myNumber < myNumber - before:
return after
else:
return before
---------------------------------2020.12.9更新-----------------------------------
突然忘了我为啥要找这个
方法1
a = [1,4,5,7,31,42,112,175,198,465]
b = 35
print(min(a, key=lambda x: abs(x - b)))
复杂度有点高,但是不要求列表有序,只要有个列表、有个目标值就行
返回索引
def closest(mylist, Number):
answer = []
for i in mylist:
answer.append(abs(Number-i))
return answer.index(min(answer))
方法2
from bisect import bisect_left
def takeClosest(myList, myNumber):
"""
Assumes myList is sorted. Returns closest value to myNumber.
If two numbers are equally close, return the smallest number.
If number is outside of min or max return False
"""
if (myNumber > myList[-1] or myNumber < myList[0]):
return False
pos = bisect_left(myList, myNumber)
if pos == 0:
return myList[0]
if pos == len(myList):
return myList[-1]
before = myList[pos - 1]
after = myList[pos]
if after - myNumber < myNumber - before:
return after
else:
return before
a = [1,4,5,7,31,42,112,175,198,465]
b = 35
answer = takeClosest(a, b)
print(answer)
时间复杂度比较低,二分方法,但要求列表有序
---------------------------------2020.11.4更新-----------------------------------
方法3
import numpy as np
def find_nearest(array, value):
array = np.asarray(array)
idx = (np.abs(array - value)).argmin()
return array[idx]
array = np.random.random(10)
print(array)
# [0.0443463 0.01646455 0.44072574 0.21144308 0.47655519 0.14408593
# 0.66480614 0.12407934 0.13441338 0.10409808]
value = 0.5
print(find_nearest(array, value))
# 0.47655518571285727
不要求列表有序,只要有个列表、有个目标值就行,只能处理1 维的
方法4
import numpy as np
def find_nearest(array,value):
idx = np.searchsorted(array, value, side="left")
if idx > 0 and (idx == len(array) or abs(value - array[idx-1]) < abs(value - array[idx])):
return array[idx-1]
else:
return array[idx]
a = [1,4,5,7,31,42,112,175,198,465]
b = 185
answer = find_nearest(a, b)
print(answer)
此方法要求列表数组有序, numpy.searchsorted,也只能处理1 维的,因为 numpy.searchsorted
的接受参数只能是1维的
---------------------------------2020.11.4更新-----------------------------------