从列表中查找最接近的坐标对

时间:2016-04-21 18:59:41

标签: python

我正在尝试将解决方案应用于之前的SO question

我有一对坐标,我希望在坐标列表中找到最近的相关坐标对。

这可以通过找到点之间的最小距离来实现:

dist = lambda s,d: (s[0]-d[0])**2+(s[1]-d[1])**2

我有一本字典,原产地:

{u'toid': u'osgb4000000029928750', u'point': [524511.405, 184846.794]}

我有另一个包含坐标对的列表,d_origins:

[(532163.5648939193, 181848.77608212957),(532449.8292416488, 181847.71793660522), (532200.2156880093, 182053.30247829395), (533794.6284605444, 181119.5631480558)]

然后我尝试通过调用dist lambda函数来找到匹配值:

match = min((origin[0]['point']),key=partial(dist,d_origins))
print origins, match

然而,输出是:

TypeError: 'float' object has no attribute '__getitem__'

1 个答案:

答案 0 :(得分:1)

min函数采用列表或可迭代。另外,可以通过具有一个参数的函数来指定排序。这意味着该函数将一个元素映射到一个值,然后由min函数进行比较以找到最小元素。

match = min(d_origins, key=lambda p: dist(p, origin['point']))

lambda表达式通过提供其中一个参数,将带有两个参数的dist函数包装到一个带有一个参数的函数中。新的匿名函数将坐标与lambda表达式中的特定原点进行比较。然后,min函数的结果是与该原点最接近的坐标。

完整示例:

>>> dist = lambda s,d: (s[0]-d[0])**2+(s[1]-d[1])**2
>>> origin = {'toid': 'osgb4000000029928750', 'point': [524511.405, 184846.794]}
>>> d_origins = [(532163.5648939193, 181848.77608212957),(532449.8292416488, 181847.71793660522), (532200.2156880093, 182053.30247829395), (533794.6284605444, 181119.5631480558)]
>>> 
>>> match = min(d_origins, key=lambda p: dist(p, origin['point']))
>>> print(str(match))
(532200.2156880093, 182053.30247829395)