---------------------------------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更新-----------------------------------