使用给定列表计算欧氏距离

Calculating Euclidean Distance With Given Lists

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

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

问题出在这里:

   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 函数来实现。如果您遍历 zip(alist, blist),它将遍历这些点。您可以通过执行

来确认这一点
list(zip(alist, blist))
Out: [(1, 4), (2, 5), (3, 6)]

因此,如果您使用 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