Как сортировать объекты 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)

Ответ 1

Если вы хотите сравнить объекты по id:

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

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

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

Ответ 2

Чтобы поддерживать сортировку без явных ключей для объектов в 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)