2009-04-08 8 views
4

複数の(x、y)順序付けられたペアが与えられているので、それらのそれぞれの間の距離を比較したいと思います。 は、だから私は順序対のリストを持っているふり:Python "round robin"

pairs = [a,b,c,d,e,f] 

私は2つのペアを注文し、それらの間の距離を見つける取る機能があります。

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 

どのように私はすべてを比較するには、この機能を使用することができますが最終的にそれらの間の距離が最も長い2つの順序付きペアを見つけることができますか?

Psuedopsuedocode:

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

すべてのヘルプは途方もいただければ幸いです。

+3

"from math import sqrt as sqrt"は "from math import sqrt"とまったく同じです。前者は "こんにちは、私の名前はロベルトですが、ただ私にロベルトと呼んでください:) –

+0

また、数学モジュールを省略し、' ** 0.5'を使用することもできます –

+0

あなたの距離関数は対称.. –

答えて

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 
+0

itertoolsを必要としなかった答え?私はこのページに戻ってきて、それはなくなった! : –

+0

whoops。代用を追加しました –

+0

これは本当に素晴らしいサイトです –

3

あなたが二度同じ2点間の距離の計算をやって気にしない場合は、以下の最大距離見つける:代わりにAとBのペアを持っているために

max([distance(a, b) for a in pairs for b in pairs]) 

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

あなたは余分な距離の比較

0を実行せずに(a、b)はタプルを取得するために、ジョンFeminellaのソリューションでこれを組み合わせることができます、そして、次の操作を行いますpython 2.6で
17

、あなたは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) 
+0

A-> BとB-> Aは同じ距離になりますので、組み合わせが良いかもしれません –

+0

そう、itertools.combinationsは大いに – Lazin

+0

2つの異なるものに対して同じ用語を使用していますより良い変数名を選択したいかもしれません "ペア"は "ペア"の項目のようですが、そうではありません。 – Algorias

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)以降、対称比較を行うことも避けています。


アップデート:私はそれはあなたがより簡潔に何をしようとして表現するよう、少し良くitertoolsを使用するEvgeny's solutionが好きです。私たちのソリューションはどちらも同じことをしています。 (注意:!あなたが組み合わせ、ない順列使用します - かなり遅くなります)

やや関連
+0

1つの可能性のある欠点を持つエレガントなソリューションです。すべての要素に対してリストを1回コピーするのはコストがかかる場合があります。 –

3

、あなたはユークリッド距離を自分で計算する必要はありません、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