2016-04-21 56 views
1

我試圖實施該解決方案到以前的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)] 

然後我試圖通過調用di ST lambda函數:

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

然而,輸出爲:

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

不應該這是'分鐘(d_origins,鍵=部分(DIST,原點[ '點']))'? –

+1

無論如何,如果您發佈錯誤,請發佈您的代碼併發布回溯。追溯是非常重要的,通常包含你的問題的答案。你沒有包括它的事實表明你沒有仔細閱讀它。 –

+0

非常真實,斯文!我通過仔細閱讀痕跡來解決它。 – LearningSlowly

回答

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)