Сортировка списка объектов класса с использованием условий в параметрах класса - PullRequest
0 голосов
/ 24 июня 2019

У меня есть список объектов, созданных из класса. Мне нужно отсортировать список, используя параметры «x» и «is_start».

Я попытался использовать модуль total_ordering из functools, а custom написал методы lt & eq.

Класс:

@total_ordering
class BuildingPoint(object):
    def __init__(self):
        self.x = None
        self.height = None
        self.is_start = None

    def __lt__(self, other):
        if self.x != other.x:
            return self.x < other.x

    def __eq__(self, other):
        if self.x == other.x:
            # If both points are starting points then building with higher height
            # comes earlier
            if self.is_start and other.is_start:
                return self.height > other.height
            # If both points are ending points then building with lower height
            # comes earlier            
            if not self.is_start and not other.is_start:
                return self.height < other.height

Теперь, если я хочу отсортировать этот список объектов BuildingPoint, где первый и третий объекты имеют одинаковые x и is_start:

building_points = [[0, 2, True], [1, 2, False], [0, 3, True], [2, 3, False]]

Сортировка building_points должна дать такой вывод:

sorted(building_points)
>>[[0, 3, True], [0, 2, True], [1, 2, False], [2, 3, False]]

Но он возвращает тот же список объектов. Любой совет, как это сделать?

1 Ответ

1 голос
/ 24 июня 2019

Как уже упоминалось @ juanpa.arrivillaga, ваши __lt__ и __eq__ были сломаны. Я только что исправил __lt__ и удалил __eq__, думаю, это то, что вы намеревались сделать. Кроме того, вы сортируете список массивов, а не ваш BuildingPoint объект. Я исправил __init__, чтобы создать BuildingPoint из массива. И наконец, я добавил __repr__ метод, чтобы иметь возможность отображать объект.

Я не уверен, что вы хотите это сделать, вот что я сделал:

from functools import total_ordering

@total_ordering
class BuildingPoint(object):
    def __init__(self,x,h,start):
        self.x = x
        self.height = h
        self.is_start = start

    def __repr__(self):
        return "[{},{},{}]".format(self.x,self.height,self.is_start)

    def __lt__(self, other):
        if self.x != other.x:
            return self.x < other.x
        else:
            if self.is_start and other.is_start:
                return self.height > other.height
            else:
                return self.height < other.height

building_points = [ BuildingPoint(*array) for array in [[0, 2, True], [1, 2, False], [0, 3, True], [2, 3, False]]]
sorted(building_points)

Выход:

[[0,3,True], [0,2,True], [1,2,False], [2,3,False]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...