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

Python 用给定列表计算欧氏距离,python,euclidean-distance,Python,Euclidean Distance,所以我有一组测试用例,它们给了我两个带数字的列表。我的任务是用给定的列表计算欧几里德距离。然而,我没有得到正确的结果。我得到的是3.7416573867739413、3.0、2.0和2.0。这就是我目前的情况,我不确定我做错了什么。问题在于: def distance(alist, blist): sum_of = 0 for x in alist: for y in blist: ans = (x - y)**2

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

问题在于:

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
因此,对于
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)
,它将迭代这些点。您可以通过执行

   for x in alist:
      for y in blist:
因此,如果您使用单圈覆盖zip更改嵌套循环,它将计算正确的距离

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

哦,好的,我明白了。如果您不介意解释,“zip”到底做什么?zip(…)zip(seq1[,seq2[…])->[(seq1[0],seq2[0]…),(…])返回一个元组列表,其中每个元组包含来自每个参数序列的第i个元素。返回列表的长度被截断为最短参数序列的长度。@EliezerShahid您可以通过阅读文档始终了解内置或标准库函数的功能:。
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