Python 肾盂最近对天真

Python 肾盂最近对天真,python,Python,我正在尝试编写最接近对算法的蛮力版本,而不使用嵌套for循环。这是我写的代码,但是代码给了我0.0,因为我在计算点与点之间的距离。如何更改代码以获得正确的最小距离 import math x = [4, -2, -3, -1, 2, -4, 1, -1, 3, -4, -2] y = [4, -2, -4, 3, 3, 0, 1, -1, -1, 2, 4] def _ClosestPair(x,y): Px = sorted(list(zip(x,y)), key

我正在尝试编写最接近对算法的蛮力版本,而不使用嵌套for循环。这是我写的代码,但是代码给了我0.0,因为我在计算点与点之间的距离。如何更改代码以获得正确的最小距离

import math

x = [4, -2, -3, -1, 2, -4, 1, -1, 3, -4, -2]  
y = [4, -2, -4,  3, 3,  0, 1, -1, -1, 2,  4] 

def _ClosestPair(x,y):  
    Px = sorted(list(zip(x,y)), key = lambda elem: elem[0])  
    return ClosestPairNaive(Px)

def ClosestPairNaive(points):
    dis = lambda p, q: math.sqrt((p[0]-q[0])**2 +  (p[1] - q[1])**2)
    return  min([dis(p,q) for p in points[:len(points)-1] for q in points[1:]])

print(_ClosestPair(x, y))
单一语句

return  min([[dis(p,q),p,q] for p in points[:len(points)-1] for q in points[1:] if p!=q])

在列表中的每个位置唯一对上循环的惯用方法是从内部循环中的i+1开始:

In [4]: data = 'abc'

In [5]: [(data[i], data[j]) for i in range(len(data)) for j in range(i+1, len(data))]
Out[5]: [('a', 'b'), ('a', 'c'), ('b', 'c')]

In [6]: data = 'abcd'

In [7]: [(data[i], data[j]) for i in range(len(data)) for j in range(i+1, len(data))]
Out[7]: [('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd'), ('c', 'd')]
在处理序列类型时,这是一个简单而有效的算法

还要注意的是,数学有一个方便的hypot函数,它只是欧几里德范数。因此,您可以将其简单地实现为:

In [8]: ps = list(zip(
    ...:     [4, -2, -3, -1, 2, -4, 1, -1, 3, -4, -2],
    ...:     [4, -2, -4,  3, 3,  0, 1, -1, -1, 2,  4]
    ...: ))

In [9]: import math
    ...: def dis(p1, p2):
    ...:     (x0, y0), (x1, y1) = p1, p2
    ...:     return math.hypot(x1 - x0, y1 - y0)
    ...:

In [10]: min(dis(ps[i], ps[j]) for i in range(len(ps)) for j in range(i + 1, len(ps)))
Out[10]: 1.4142135623730951

注意,将lambda表达式的结果指定给名称是针对PEP8的。因此,您应该使用snake_case而不是CapitalCase作为函数名

对于示例中的x,y,您希望哪对点作为输出?[disp,q For p in points[:lenpoints-1]For q in points[1:]是嵌套的For循环,尽管它看起来不像一个。你到底想避免什么?列表理解很难调试。因此,如果遇到涉及列表理解的错误,首先要做的是将理解表达式展开到for循环中,以便插入print调用以查看发生了什么。当你有了有效的代码时,你可以把它转换成列表理解。@Dyz:我想学习正确地编写列表理解。我想写一个嵌套的循环平面。我知道这只是一种编写嵌套for循环的惯用方法。非常感谢!!!我写的是:min[让我失望,给我点[j],在rangelenpoints中给我点[j],在rangei+1中给j点,lenpoints],它成功了!!!