Python: сортировать пользовательский класс без использования аргумента `key`?
Вы можете отсортировать массив myclass
с помощью аргумента key
функции sorted
:
sortedlist = sorted(myclasses, key=lambda obj: obj.myproperty)
Есть ли способ определить естественный порядок для нашего класса? Возможно, какой-то волшебный метод, чтобы мы не каждый раз проходили ключ?
например.
class myclass:
def __init__(self,a,b):
self.key1 = a
self.key2 = b
def __sortkey__(self):
return self.key2
Или это будет естественно работать, если мы определим __le__
возможно?
Ответы
Ответ 1
В дополнение к __cmp__
вы также можете сделать это с помощью так называемых "богатых операторов сравнения" __eq__
, __le__
, __lt__
, __gt__
и __ge__
. Вместо определения всех из них вы можете использовать декоратор класса functools.total_ordering
в версии 2.7 +/3.1+. __cmp__
отсутствует в 3.x.
Ответ 2
Я бы сделал это, переопределив __cmp__
class myclass:
def __init__(self,a,b):
self.key1 = a
self.key2 = b
def __cmp__(self, other):
return cmp(self.key2, other.key2)
Ответ 3
Смотрите этот предыдущий вопрос. Ответ заключается в том, что вы можете избежать использования только __lt__
, но лучше использовать functools.total_ordering
.