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