2016-12-09 13 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 

Also habe ich eine Reihe von Testfällen, die mir zwei Listen mit Zahlen geben. Meine Aufgabe ist es, die euklidische Distanz mit den gegebenen Listen zu berechnen. Ich bekomme jedoch nicht die richtigen Ergebnisse. Ich bekomme stattdessen 3,7416573867739413, 3,0, 2,0 und 2,0. Das habe ich bisher und ich bin mir nicht sicher, was ich falsch mache.Berechnung der euklidischen Entfernung mit vorgegebenen Listen

Antwort

4

Das Problem ist hier:

for x in alist: 
     for y in blist: 

für jeden Punkt also in alist Sie alle Punkte in blist besuchen. Zum Beispiel für alist = [1, 2, 3] und blist = [4, 5, 6] würde diese Schleife Paare generieren (1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6) Aber was Sie tun möchten, ist nur zu betrachten (1, 4), (2, 5), (3, 6). Dies kann mit der Zip-Funktion erreicht werden. Wenn Sie über zip(alist, blist) iterieren, wird über diese Punkte iteriert. Sie können dies durch

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

Ausführung bestätigen also, wenn Sie die verschachtelten Schleifen mit einer einzigen Schleife über zip ändern, wird es den richtigen Abstand berechnen.

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

Oh okay, ich verstehe. Wenn es Ihnen nichts ausmacht zu erklären, was genau macht "zip"? – Laser

+1

zip (...) zip (seq1 [, seq2 [...]]) -> [(seq1 [0], seq2 [0] ...), (...)] Eine Liste zurückgeben von Tupeln, wobei jedes Tupel das i-te Element von jeder der Argumentsequenzen enthält. Die zurückgegebene Liste wird Länge auf die Länge der kürzesten Argumentsequenz abgeschnitten. – kvivek

+1

@EliezerShahid Sie können immer herausfinden, was eine eingebaute oder Standard-Bibliotheksfunktion tut, indem Sie die Dokumentation lesen: ['zip()'] (https://docs.python.org/3/library/functions.html#zip). –

Verwandte Themen