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。这就是我到目前为止所拥有的,我不确定我做错了什么。
问题就在这里:
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)
| 归档时间: |
|
| 查看次数: |
2749 次 |
| 最近记录: |