【问题标题】:Calculating Euclidean Distance With Given Lists使用给定列表计算欧几里得距离
【发布时间】:2017-04-25 08:44:52
【问题描述】:
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。这是我到目前为止所拥有的,我不确定我做错了什么。

【问题讨论】:

    标签: python euclidean-distance


    【解决方案1】:

    问题出在这里:

       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
    

    【讨论】:

    • 哦,好吧,我明白了。如果您不介意解释,“zip”究竟是做什么的?
    • zip(...) zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...) ] 返回一个元组列表,其中每个元组包含来自每个参数序列的第 i 个元素。返回的列表在长度上被截断为最短参数序列的长度。
    • @EliezerShahid 您可以通过阅读文档了解内置或标准库函数的作用:zip()
    猜你喜欢
    • 1970-01-01
    • 2021-01-31
    • 2015-09-23
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 2013-04-07
    • 2020-11-29
    相关资源
    最近更新 更多