0

我有一个包含两个元素的列表,如下所示:

list_a = [27.666521, 85.437447]

和另一个这样的列表:

big_list = [[27.666519, 85.437477], [27.666460, 85.437622], ...]

我想找到最接近的list_amatch list_b

例如,这里最接近的匹配是[27.666519, 85.437477].

我怎么能做到这一点?

我在这里发现了一个类似的问题,用于查找数组中字符串的最接近匹配,但无法针对上述问题类似地重现它。

PS列表中的元素是地球上各点的坐标。

4

2 回答 2

10

从你的问题中,很难说出你想如何测量距离,所以我只是假设你的意思是欧几里得距离。

您可以使用该key参数min()

from functools import partial

def distance_squared(x, y):
    return (x[0] - y[0])**2 + (x[1] - y[1])**2

print min(big_list, key=partial(distance_squared, list_a))
于 2012-07-24T11:40:50.830 回答
1

假设:

  • 您打算在同一个列表列表中多次进行此类型查询
  • 查询列表和列表列表中的列表都表示 n 维欧几里得空间中的点(这里:二维空间,与来自球形空间的 GPS 位置不同)。

这读起来像最近邻搜索。可能您应该考虑专门用于此的库,例如scikits.ann

例子:

import scikits.ann as ann
import numpy as np
k = ann.kdtree(np.array(big_list))
indices, distances = k.knn(list_a, 1)

这在内部使用欧几里得距离。您应该确保您应用的距离度量符合您的接近度概念。

您可能还想看看Quadtree,这是另一种数据结构,您可以应用它来避免对整个列表列表进行强力最小搜索。

于 2012-07-24T11:50:43.290 回答