Python"循环"

4 python iteration round-robin

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

pairs = [a,b,c,d,e,f]
Run Code Online (Sandbox Code Playgroud)

我有一个函数,它需要两个有序对,并找到它们之间的距离:

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
Run Code Online (Sandbox Code Playgroud)

如何使用此函数将每个有序对与每个其他有序对进行比较,最终找到它们之间距离最大的两个有序对?

Psuedopsuedocode:

     distance(a,b)
     distance(a,c)
     ...
     distance(e,f)
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激.

Evg*_*zin 17

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

import itertools
perms = itertools.permutations(pairs, 2)
distances = (distance(*p) for p in perms)
Run Code Online (Sandbox Code Playgroud)

要么

import itertools
combs = itertools.combinations(pairs, 2)
distances = (distance(*c) for c in combs)
Run Code Online (Sandbox Code Playgroud)


Joe*_*erg 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
Run Code Online (Sandbox Code Playgroud)


Joh*_*lla 6

尝试:

max(distance(a, b) for (i, a) in enumerate(pairs) for b in pairs[i+1:])
Run Code Online (Sandbox Code Playgroud)

这避免身份-比较(例如distance(x, x),distance(y, y)等).它也避免了进行对称比较,因为distance(x, y) == distance(y, x).


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