Python X轴最近点

时间:2014-11-02 17:09:27

标签: python algorithm python-3.x

我试图想出一个简单的算法而不导入你有几个x轴点的模块,比如

d = [-5, -3.5, -2.8, -0.6, 1.2, 3.4, 5.6]

并且在提示用户输入某个点的地方,程序应该给出用户输入值最接近的点,因为有可能最接近的负值我只需要一般的想法。

2 个答案:

答案 0 :(得分:2)

两个步骤:

  1. 使用bisect module查找最接近的较低值的索引
  2. 使用最接近的较低值与下一个较高值之间的绝对距离来选择其中一个。
  3. 这是一个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)

上述代码的作用是返回每个点的绝对值的最小值,并从中减去用户输入点。