计算给定列表的欧几里德距离

Las*_*ser 4 python euclidean-distance

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

所以我有一组测试用例,它们给了我两个带有数字的列表。我的任务是计算给定列表的欧几里德距离。但是,我没有得到正确的结果。相反,我得到的是 3.7416573867739413、3.0、2.0 和 2.0。这就是我到目前为止所拥有的,我不确定我做错了什么。

ayh*_*han 5

问题就在这里:

   for x in alist:
      for y in blist:
Run Code Online (Sandbox Code Playgroud)

因此,对于 中的每个点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 函数来实现。如果您迭代zip(alist, blist),它将迭代这些点。您可以通过执行来确认这一点

list(zip(alist, blist))
Out: [(1, 4), (2, 5), (3, 6)]
Run Code Online (Sandbox Code Playgroud)

因此,如果您使用 zip 上的单个循环更改嵌套循环,它将计算出正确的距离。

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