在包含列表的列表中查找列表中最接近的匹配项

时间:2012-07-24 11:37:16

标签: python python-2.7

我有一个包含两个元素的列表:

list_a = [27.666521, 85.437447]

和另一个这样的列表:

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

我希望在list_a内找到list_b最接近的匹配。

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

我怎样才能实现这个目标?

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

P.S。列表中的元素是地球上各点的坐标。

2 个答案:

答案 0 :(得分:11)

从您的问题来看,很难说出您想要如何测量距离,因此我假设您的意思是欧几里德距离。

您可以将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))

答案 1 :(得分:1)

假设:

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

这类似于nearest neighbor search。您可能应该考虑专门用于此目的的图书馆,例如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,这是您可以应用的另一种数据结构,以避免对整个列表列表进行强力最小搜索。