Python“;循环制;

Python“;循环制;,python,iteration,round-robin,Python,Iteration,Round Robin,给定多个(x,y)有序对,我想比较它们之间的距离。 假设我有一个有序配对的列表: pairs = [a,b,c,d,e,f] 我有一个函数,它取两个有序对,并求它们之间的距离: def distance(a,b): from math import sqrt as sqrt from math import pow as pow d1 = pow((a[0] - b[0]),2) d2 = pow((a[1] - b[1]),2) distance =

给定多个(x,y)有序对,我想比较它们之间的距离。 假设我有一个有序配对的列表:

pairs = [a,b,c,d,e,f]
我有一个函数,它取两个有序对,并求它们之间的距离:

def distance(a,b):
    from math import sqrt as sqrt
    from math import pow as pow
    d1 = pow((a[0] - b[0]),2)
    d2 = pow((a[1] - b[1]),2)
    distance = sqrt(d1 + d2)
    return distance
如何使用此函数将每个有序对与其他有序对进行比较,最终找到它们之间距离最大的两个有序对

Psuedopsuedocode:

     distance(a,b)
     distance(a,c)
     ...
     distance(e,f)

非常感谢您提供的任何帮助。

如果您不介意在两个相同的点之间进行距离计算,以下将找到最大距离:

try:

    from itertools import combinations

except ImportError:

    def combinations(l, n):
        if n != 2: raise Exception('This placeholder only good for n=2')
        for i in range(len(l)):
            for j in range(i+1, len(l)):
                yield l[i], l[j]


coords_list = [(0,0), (3,4), (6,8)]

def distance(p1, p2):
    return ( ( p2[0]-p1[0] ) ** 2 + ( p2[1]-p1[1] )**2 ) ** 0.5

largest_distance, (p1, p2) = max([
     (distance(p1,p2), (p1, p2)) for (p1,p2) in combinations(coords_list, 2)
     ])


print largest_distance, p1, p2
max( [distance(a, b) for a in pairs for b in pairs] )
要使用a和b对,请执行以下操作:

import operator
max( [((a,b), distance(a, b)) for a in pairs for b in pairs], key=operator.itemgetter(1))

您可以将其与John Feminella的解决方案结合起来,获得(a,b)元组,而无需进行额外的距离比较

在python 2.6中,您可以使用itertools.permutations

import itertools
perms = itertools.permutations(pairs, 2)
distances = (distance(*p) for p in perms)

尝试:

这避免了身份比较(例如距离(x,x),
距离(y,y)
,等等)。它还避免进行对称比较,因为
距离(x,y)=距离(y,x)



更新:我喜欢更好地使用
itertools
,因为它更简洁地表达了您想要做的事情。我们的两种解决方案都做相同的事情。(注意:一定要使用组合,而不是排列,这样会慢得多!)

稍微相关一点,你不必自己计算欧几里德距离,还有数学。海波:

In [1]: a = (1, 2)
In [2]: b = (4, 5)
In [3]: hypot(a[0]-b[0], a[1]-b[1])
Out[3]: 4.2426406871192848

“从数学导入sqrt作为sqrt”与“从数学导入sqrt”完全相同。前者就像说“嗨,我叫罗伯托,但就叫我罗伯托吧”:)你也可以省略数学模块,使用
**0.5
我想你真的想要无序对,因为你的距离函数是对称的。@John:听起来不错。还有,他的例子停在距离(e,f)上——如果他想要有序对,最后一个就是距离(f,e)。一个小提示:如果你不关心实际距离是多少(只是它们是相距最远的两对),你可以消除平方根来加快速度。平方是单调的,对于大于或等于0的值,平方是递增的。i、 e.x>y当且仅当xx>yy表示x,y>=0。组合可能更好,因为A->B和B->A的距离相同。您对两个不同的事物使用相同的术语。可能需要选择更好的变量名。“pair”似乎是一个“pairs”项,但事实并非如此。不需要itertools的答案怎么了?我回到这一页,它就不见了!:(这是一个优雅的解决方案,有一个可能的缺点:为每个元素复制一次列表可能代价高昂。
max(distance(a, b) for (i, a) in enumerate(pairs) for b in pairs[i+1:])
In [1]: a = (1, 2)
In [2]: b = (4, 5)
In [3]: hypot(a[0]-b[0], a[1]-b[1])
Out[3]: 4.2426406871192848