Во-первых, как отмечено в Odds and Ends документации по сортировке:
Процедуры сортировки гарантированно будут использовать __lt__()
при сравнении двух объектов.Таким образом, легко добавить стандартный порядок сортировки в класс, определив метод __lt__()
Это также упоминается в документации sort()
:
Этот метод сортирует список на месте, используя только <сравнения между элементами. </p>
Так что вам нужно только реализовать метод __lt__
.
Вам не нужен __gt__
и __cmp__
больше не действительны для Python3 .
Далее, метод __lt__
должен возвращать либо True
, либо False
.
# is self < other_vertice?
def __lt__(self, other_vertice):
if self.x > other_vertice.x:
return False
elif self.x < other_vertice.x:
return True
else:
if self.y > other_vertice.y:
return False
elif self.y < other_vertice.y:
return True
else:
return False
После этого ваш код в main
должен теперь работать:
def main():
lista = []
for i in range(0, 10):
a = random.randint(1, 2)
b = random.randint(1, 99)
lista.append(Vertice(a, b))
print("UNSORTED")
for elemento in lista:
print(elemento)
print("SORTED")
lista.sort()
for elemento in lista:
print(elemento)
main()
Результат:
UNSORTED
Vértice (48,44)
Vértice (5,92)
Vértice (46,10)
Vértice (55,51)
Vértice (63,54)
Vértice (53,85)
Vértice (95,18)
Vértice (69,84)
Vértice (8,20)
Vértice (97,64)
SORTED
Vértice (5,92)
Vértice (8,20)
Vértice (46,10)
Vértice (48,44)
Vértice (53,85)
Vértice (55,51)
Vértice (63,54)
Vértice (69,84)
Vértice (95,18)
Vértice (97,64)
Результат (когда некоторые вершины имеют одинаковые x
):
UNSORTED
Vértice (1,88)
Vértice (1,65)
Vértice (2,87)
Vértice (2,4)
Vértice (2,69)
Vértice (2,81)
Vértice (2,5)
Vértice (1,36)
Vértice (1,97)
Vértice (1,73)
SORTED
Vértice (1,36)
Vértice (1,65)
Vértice (1,73)
Vértice (1,88)
Vértice (1,97)
Vértice (2,4)
Vértice (2,5)
Vértice (2,69)
Vértice (2,81)
Vértice (2,87)