2016-12-09 14 views
4
def distance(alist, blist): 
    sum_of = 0 
    for x in alist: 
     for y in blist: 
      ans = (x - y)**2 
      sum_of += ans 
    return (sum_of)**(1/2) 
print(distance([1, 1, 3], [2, 2, 3])) #1.4142135623730951 
print(distance([1, 2, 3], [2, 2, 3])) #1.0 
print(distance([2, 2, 3], [2, 2, 3])) #0.0 
print(distance([1, 1], [2, 2])) #1.4142135623730951 

私は数字のリストを2つ与えてくれる一連のテストケースを持っています。私の仕事は、指定されたリストとユークリッド距離を計算することです。しかし、私は正しい結果を得ていません。私は代わりに3.7416573867739413、3.0、2.0、2.0を取得しています。これは私がこれまで行ってきたことであり、私は何が間違っているのか分かりません。与えられたリストでユークリッド距離を計算する

答えて

4

問題はここにある:

for x in alist: 
     for y in blist: 

のでalistの各点のために、あなたはblist内のすべてのポイントを訪問しています。たとえば、alist = [1, 2, 3]blist = [4, 5, 6]の場合、このループはペアを生成します(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)しかし、あなたがしたいのは(1, 4), (2, 5), (3, 6)だけです。これは、ジップ機能で実現できます。 zip(alist, blist)を反復処理すると、それらのポイントを反復処理します。あなたはジップ上の単一のループでネストされたループを変更するのであれば、それは正しい距離を計算します

list(zip(alist, blist)) 
Out: [(1, 4), (2, 5), (3, 6)] 

を実行することでこれを確認することができます。

def distance(alist, blist): 
    sum_of = 0 
    for x, y in zip(alist, blist): 
     ans = (x - y)**2 
     sum_of += ans 
    return (sum_of)**(1/2) 


distance([1, 1, 3], [2, 2, 3]) 
Out: 1.4142135623730951 
+0

わかりました。あなたが説明を気にしないなら、正確に "ジップ"は何をしますか? – Laser

+1

zip(...) ジップ(seq1 [、seq2 [...])) - > [(seq1 [0]、seq2 [0] ...)、(...)] リストを返す各タプルには引数の各シーケンスからのi番目の要素 が含まれています。返されるリストは、最も短い引数シーケンスの長さの長さが、 に切り捨てられます。 – kvivek

+1

@EliezerShahidドキュメントを読むことで、組み込み関数や標準ライブラリ関数が何をするのかをいつでも知ることができます:['zip()'](https://docs.python.org/3/library/functions.html#zip)。 –

関連する問題