我正在尝试将解决方案应用于之前的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__'
答案 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)