Возникли трудности с построением двоичного дерева из списка экземпляров класса

#python #algorithm #oop #binary-tree

Вопрос:

Я пытаюсь построить дерево KD для поиска «ближайшего соседа K». Я создал класс под названием «Точка», который содержит атрибуты: pointID, широта (широта) и долгота (долгота). входными данными для build_index является массив «точки», содержащий все экземпляры точек.

в приведенном ниже коде я пытаюсь построить дерево KD, но у меня возникают проблемы с попытками извлечь только lat и Lon каждой точки для сортировки, но я понимаю, что простое использование «точек» не будет работать, так как это массив только с экземплярами классов.

заранее спасибо за помощь!

 class KDTreeNN(NearestNeigh):

   def build_index(self, points: [Point]):
       depth = 0
       n = len(points)
       if n <0:
           return None
       axis = depth % 2
       sorted_points = sorted(points, key = lambda point: point[axis])
       depth   1
       return {
           'point' : sorted_points[int(n/2)],
           'left' : self.build_index(sorted_points[:int(n/2)]),
           'right' : self.build_index(sorted_points[int(n/2)   1:])
       }



 

Ответ №1:

point[axis] не работает, потому point что не поддерживает такую скобочную нотацию.

Существует несколько решений:

  1. Определить Point как именованный кортеж:

    Вместо того, чтобы определять Point как что-то вроде:

     class Point:
        def __init__(self, pointID, lat, lon):
            self.pointID = pointID
            self.lat = lat
            self.lon = lon
     

    …определите его как именованный кортеж. Убедитесь, что сделали lon и lat его первые два участника:

     Point = namedtuple("Point", "lat,lon,pointID")
     

    Также убедитесь, что при создании Point экземпляров вы расположили аргументы в правильном порядке.

    С этим изменением это сработает. Это требует, чтобы вы рассматривали Point экземпляры как неизменяемые.

  2. Доступ к атрибуту ( lon или lat ) в зависимости от строковой переменной:
     axis = ("lon", "lat")[depth % 2]
    sorted_points = sorted(points, key = lambda point: getattr(point, axis))