首页 > 解决方案 > 查找与提供的最接近的数字配对匹配的索引

问题描述

我在 Python 中有三个单独的列表,它们都非常大。一个规定是列表不能从它们当前的显示方式重新排序。每个列表的外观片段如下:

lats = [40.92322342,40.92322342,40.92322342,40.92322342,40.92322342] lons = [-74.32176109,-74.29518277,-74.26860445,-74.24202613,-74.21544781] data = [19,19,19,17,18]

我希望提供纬度和经度配对,并希望返回与data提供的纬度和经度最接近的列表的索引号和相应值。

例如,配对40.9254, -74.2765将返回相应的索引号,这将是上面提供的列表片段中的第三组值。

使用此示例,我已经能够按单个列表对搜索进行分区并返回相应的索引号。但是,索引号是不同的。

代码:

min(enumerate(lats), key=lambda x: abs(x[1]-40.9254)) min(enumerate(lons), key=lambda x: abs(x[1]-(-74.2765)))

an index #, 40.92322342 a different index # than above, -74.26860445

有没有什么有效的方法可以解决这个问题?

标签: pythonarrayslistindexingmin

解决方案


您可以先使用 找到两点之间的欧几里德距离sqrt((x[0] - y[0]) ** 2 + (x[1] - y[1]) ** 2),然后将其与min()as结合使用key以找到最近点。

from math import sqrt

lats = [40.92322342,40.92322342,40.92322342,40.92322342,40.92322342]
lons = [-74.32176109,-74.29518277,-74.26860445,-74.24202613,-74.21544781]

def euclidean_distance(x, y):
    return sqrt((x[0] - y[0]) ** 2 + (x[1] - y[1]) ** 2)

def find_closest_point(data, point):
    # create (point, index) pairs
    indices = ((e, i) for i, e in enumerate(data))

    # find smallest point, and only return the index
    return min(indices, key=lambda p: euclidean_distance(p[0], point))[1]

print(find_closest_point(zip(lats, lons), (40.9254, -74.2765)))

返回第三对坐标(索引从 0 开始):

2

注意:你可以在一个元组列表中开始,lats然后lons你不需要调用zip()函数。


推荐阅读