简体   繁体   中英

Python Closest coordinates in dictionary

I have the following dictionary:

points = {'Location1': (76, 81), 'Location2': (75, 105), 'Location3': (76, 130), 'Location4': (76, 152)}

I am trying to if I have a set of coordinates; coord = (x, y) to find key with the closest value pairs to the coordinates. But I want retrieve the key that correspond to the closest.

I did it this way but there has to be a more efficient way.

points = {'Location1': (76, 81), 'Location2': (75, 105), 'Location3': (76, 130), 'Location4': (76, 152)}
array =  [(76, 81),  (75, 105),  (76,  130), (76,  152)]

def find_nearest(array,coord):

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

    result = min(array, key=partial(dist, coord))

    return result

found = find_nearest(array,coord)

print (list(points.keys())[list(points.values()).index(found)])

You don't need to use the list ( array ) at all, you can pass the dictionary ( points ) to min ; key of dictionary will be passed to key function:

>>> from functools import partial
>>>
>>> def find_nearest(points, coord):
...     dist = lambda s, key: (s[0] - points[key][0]) ** 2 + \
...                           (s[1] - points[key][1]) ** 2
...     return min(points, key=partial(dist, coord))
...
>>> points = {'Location1': (76, 81), 'Location2': (75, 105),
...           'Location3': (76, 130), 'Location4': (76, 152)}
>>> find_nearest(points, (0, 0))
'Location1'
>>> find_nearest(points, (100, 100))
'Location2'
>>> find_nearest(points, (100, 200))
'Location4'

By accessing coord in lambda directly, you can remove partial :

def find_nearest(points, coord):
    dist = lambda key: (coord[0] - points[key][0]) ** 2 + \
                       (coord[1] - points[key][1]) ** 2
    return min(points, key=dist)

or

def find_nearest(points, coord):
    x, y = coord
    dist = lambda key: (x - points[key][0]) ** 2 + (y - points[key][1]) ** 2
    return min(points, key=dist)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM