比较在列表上循环的值的python方法

2024-10-01 09:39:37 发布

您现在位置:Python中文网/ 问答频道 /正文

从API中我得到了一个包含不同坐标的“列表列表”:

List = [[1.0, 2.5, 3.6], [2.02, 2.3, 3.1], [1.5, 6.5, 3.9]]

我必须找到两个坐标之间的最小距离。 我做了这样的事情:

MinDist = 9999999999.
for Coord1 in List:
    for Coord2 in List:
        if Coord1 != Coord2:
            Dist = CalcDistance(Coord1,Coord2)
            if Dist < MinDist:
                MinDist=Dist

有没有更“聪明”(更快)的方法来获取这些信息?你知道吗


Tags: 方法inapi信息距离列表forif
2条回答

假设CalcDistance类似于下面的内容,您可以将^{}和键函数与^{}一起使用

from itertools import zip_longest, combinations

def CalcDistance(a, b):
    return (sum((x-y)**2 for x, y in zip_longest(a, b, fillvalue=0)))**.5

List = [[1.0, 2.5, 3.6], [2.02, 2.3, 3.1], [1.5, 6.5, 3.9]]

print(min(combinations(List, 2), key=lambda x: CalcDistance(*x)))
# ([1.0, 2.5, 3.6], [2.02, 2.3, 3.1])

为什么不使用内置算法:

import numpy as np
from scipy.spatial.distance import pdist, squareform

List = [[1.0, 2.5, 3.6], [2.02, 2.3, 3.1], [1.5, 6.5, 3.9]]

dist_mat = squareform(pdist(List, CalcDistance))
np.fill_diagonal(dist_mat,np.inf)
i,j = np.unravel_index(dist_mat.argmin(), dist_mat.shape)

print((List[i],List[j]))

上面的代码组合了Find the index of the min value in a pdist condensed distance matrixNumpy minimum in (row, column) format

相关问题 更多 >