给定多个(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)
非常感谢任何帮助。
答案 0 :(得分:17)
在python 2.6中,您可以使用itertools.permutations
import itertools
perms = itertools.permutations(pairs, 2)
distances = (distance(*p) for p in perms)
或
import itertools
combs = itertools.combinations(pairs, 2)
distances = (distance(*c) for c in combs)
答案 1 :(得分:10)
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
答案 2 :(得分:6)
尝试:
max(distance(a, b) for (i, a) in enumerate(pairs) for b in pairs[i+1:])
这可以避免身份比较(例如distance(x, x)
,distance(y, y)
等)。它也避免了对称比较,因为distance(x, y) == distance(y, x)
。
更新:我喜欢 Evgeny's solution 更好地使用itertools
,因为它表达了您想要更简洁地做的事情。我们的两个解决方案都做同样的事情。 (注意:请确保使用组合,而不是排列 - 这将会慢得多!)
答案 3 :(得分:4)
略有关联,你不必自己计算欧氏距离,有math.hypot:
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
答案 4 :(得分:3)
如果您不介意在两个相同的两个点之间进行距离计算,则以下内容将找到最大距离:
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)元组,而无需进行过多的距离比较