我试图想出一个简单的算法而不导入你有几个x轴点的模块,比如
d = [-5, -3.5, -2.8, -0.6, 1.2, 3.4, 5.6]
并且在提示用户输入某个点的地方,程序应该给出用户输入值最接近的点,因为有可能最接近的负值我只需要一般的想法。
答案 0 :(得分:2)
两个步骤:
bisect
module查找最接近的较低值的索引这是一个O(logN)算法;对于N个点,最多需要执行N个步骤。将其与绝对距离排序进行比较,其中O(NlogN)用于找到最近的点,或者使用min()
取O(N)。
考虑到第一步可以在开头或结尾选择一个索引,其中没有更低或更高的第二点:
import bisect
def nearest(x, d):
index = bisect.bisect(d, x)
if not index:
return d[index] # left-most x coordinate
if index == len(d):
return d[-1] # right-most x coordinate
return min(d[index - 1:index + 1], key=lambda v: abs(v - x))
演示:
>>> import bisect
>>> def nearest(x, d):
... index = bisect.bisect(d, x)
... if not index:
... return d[index] # left-most x coordinate
... if index == len(d):
... return d[-1] # right-most x coordinate
... return min(d[index - 1:index + 1], key=lambda v: abs(v - x))
...
>>> d = [-5, -3.5, -2.8, -0.6, 1.2, 3.4, 5.6]
>>> nearest(10, d)
5.6
>>> nearest(-10, d)
-5
>>> nearest(0, d)
-0.6
>>> nearest(3, d)
3.4
为了完整起见,min()
方法是:
min(d, key=lambda v: abs(v - x))
答案 1 :(得分:0)
min(array, key=lambda x: abs(x)-point)
上述代码的作用是返回每个点的绝对值的最小值,并从中减去用户输入点。