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

posted on 2021-06-09 19:41  雾恋过往  阅读(1335)  评论(0编辑  收藏  举报

Live2D