Как сортировать объекты Python

у меня есть вложенный список, который содержит разные объекты, они дублируют пары объектов во вложенном списке, и я пытаюсь удалить их, но я продолжаю получать

TypeError: unorderable types: practice() < practice()

Я знаю, что эта ошибка вызвана тем, что я пытаюсь работать с объектами, а не целыми числами, но я не знаю, как еще удалить дубликаты вот что я пробовал

class practice:
    id = None

    def __init__(self,id):
        self.id = id

a = practice('a')
b = practice('b')
c = practice('c')
d = practice('d')
e = practice('e')
f = practice('f')

x = [[a,b],[c,d],[a,b],[e,f],[a,b]]

unique_list = list()
for item in x:
    if sorted(item) not in unique_list:
        unique_list.append(sorted(item))

print(unique_list)

2 ответов


если вы хотите сравнить объекты по идентификатору:

class practice:
    id = None

    def __init__(self,id):
        self.id = id

    def __lt__(self, other):
        return other.id > self.id

    def __gt__(self, other):
        return self.id > other.id

unique_list = list()
for item in x:
    if sorted(item) not in unique_list:
        unique_list.append(sorted(item))

print(unique_list)
[[<__main__.practice object at 0x7fe87e717c88>, <__main__.practice object at 0x7fe87e717cc0>],
 [<__main__.practice object at 0x7fe86f5f79e8>, <__main__.practice object at 0x7fe86f589278>],
 [<__main__.practice object at 0x7fe86f589be0>, <__main__.practice object at 0x7fe86f589c18>]]

в зависимости от функциональности, которую вы хотите реализовать все богатые методы сравнения заказа можно использовать functools.total_ordering, вам просто нужно определить один из методов, и он позаботится об остальном

from functools import total_ordering
@total_ordering
class practice:
    id = None

    def __init__(self,id):
        self.id = id

    def __lt__(self, other):
        return other.id > self.id

    def __eq__(self, other):
        return self.id == other.id

учитывая класс, определяющий один или несколько богатых методов сравнения, этот декоратор класса предоставляет остальное. Это упрощает усилия, связанные с указанием всех возможных операций сравнения rich:

класс должен определить один из __lt__(), __le__(), __gt__() или __ge__(). Кроме того, класс должен предоставить __eq__() метод.


чтобы поддерживать сортировку без явных ключей для объектов в Python 3, необходимо реализовать __lt__ специальные способ:

class practice:
    id = None

    def __init__(self,id):
        self.id = id

    def __lt__(self, other):
        return self.id < other.id

если вы хотите, чтобы другие операторы работали, Вам также придется реализовать их специальные методы, но для сортировки __lt__ все, что вам нужно.

как отмечено в комментариях, другой способ сделать это-предоставить явную ключевую функцию sorted встроенный:

sorted(item, key=lambda x: x.id)