找出给定数字上下最接近的元素

19
myArr = array([4,1,88,44,3])
myNumber = 25
FindClosest(myArr, myNumber)
...
4, 44

有没有办法在一个列表中找到离给定数字最近的两个数,使其中一个数比它高,另一个数比它低?

我可以按以下方式找到最接近的数字:

min(myArr.tolist(), key=lambda x:abs(x-myNumber))
4个回答

48

排序并不是必要的,这会使得时间复杂度变成了O(n logn),而实际上可以做到O(n)。

我相信这就是你所需要的,利用numpy数组索引的优势:

>>> # the smallest element of myArr greater than myNumber
>>> myArr[myArr > myNumber].min()  
44

>>> # the largest element of myArr less than myNumber
>>> myArr[myArr < myNumber].max()
4

5
我必须称赞你运用的逻辑清晰明了。 - user1121588

5
above = min([i for i in myArr if myNumber < i])
below = max([i for i in myArr if myNumber > i])

此外,正确答案是44, 4而不是44, 88

2
这并不保证得到一个更大的和一个更小的,只是最接近的两个。 - wim
@wim,我已经更新了它。现在应该可以正常工作了。 - Bohdan Pylypenko
应该添加try except ValueError以防止以上或以下不存在。 - gilad eini

5
upper = min([ i for i in myArr.tolist() if i >= myNumber], key=lambda x:abs(x-myNumber))
lower = min([ i for i in myArr.tolist() if i < myNumber], key=lambda x:abs(x-myNumber))

0

我有一个答案,可以找到最接近输入值的2个数字,请参见下面的程序:

from collections import OrderedDict


def find_closer():
    a = [9, 19, 87, 43, 10]
    b = int(input("Enter number :"))
    # diff_list = []
    diff_dict = OrderedDict()
    if b in a:
        b = input("Number already exists, please enter another number ")
    else:
        for x in a:
            diff = x - b
            if diff < 0:
                # diff_list.append(diff*(-1))
                diff_dict[x] = diff*(-1)
            else:
                # diff_list.append(diff)
                diff_dict[x] = diff
    print("diff_dict", diff_dict)
    # print(diff_dict[9])
    sort_dict_keys = sorted(diff_dict.keys())
    print(sort_dict_keys)
    closer_less = 0
    closer_more = 0
    for closer in sort_dict_keys:
        if closer < b:
            closer_less = closer
        else:
            closer_more = closer
            break
    print("closer less =", closer_less, "and closer more =", closer_more)


find_closer()

这是一个纯Python程序。希望它能有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接