Найти индекс, который соответствует ближайшему предоставленному соединению номеров - PullRequest
1 голос
/ 27 октября 2019

У меня есть три отдельных списка в 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

Существуют ли эффективные способы решения этой проблемы?

Ответы [ 2 ]

1 голос
/ 27 октября 2019

Сначала вы можете найти евклидово расстояние между двумя точками, используя sqrt((x[0] - y[0]) ** 2 + (x[1] - y[1]) ** 2), а затем использовать его вместе с min() как 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() в функции.

0 голосов
/ 27 октября 2019

Почему бы не создать объект для широты и долготы.

class LatLong:

      def __init__(self, lat, lon):
          self.lat = lat
          self.lon = lon

Затем создать единый список объектов и для заданного широты и долготы, просто перебрать список объектов и вернуть объект

...