Некоторые животные равнее: сравниваем объекты в питонеБританские учёные, известные своими исследованиями, решили составить общемировой рейтинг животных. Согласно методике, каждая зверюга описывается четырьмя атрибутами:
class Pet:
def __init__(self, type, name, weight, importance):
self.type = type
self.name = name
self.weight = weight
self.importance = importance
def __repr__(self):
return self.name
weight
— это вес в килограммах, а
importance
— чувство собственной важности (единица измерения не сообщается). Общий ранг рассчитывается как
(weight + importance)
.
С методикой разобрались, осталось всех сравнить и построить итоговый рейтинг:
frank = Pet(type="голубь", name="Френк", weight=1, importance=100)
claire = Pet(type="лиса", name="Клер", weight=5, importance=90)
zoe = Pet(type="свинка", name="Зоя", weight=90, importance=10)
pets = [claire, frank, zoe]
sorted(pets)
TypeError: '<' not supported between instances of 'Pet' and 'Pet'
Вот досада, по умолчанию питон не знает, как сравнивать зверей. Дальше к нашим услугам куча способов, как это сделать.
Если хотим просто отсортировать список, подойдёт аргумент
key
в функции
sorted
:
key = lambda x: x.weight + x.importance
sorted_pets = sorted(
pets,
key=key,
reverse=True
)
print("Рейтинг по методике:")
print(sorted_pets)
Рейтинг по методике:
[Френк, Зоя, Клер]
key
— это функция, которая принимает наш объект, а возвращает число. Функция
sorted
упорядочивает список объектов именно по этим числам.
Если сортировать только по ЧСВ, можно даже свою функцию не писать — в модуле
operator
есть готовая:
import operator
key = operator.attrgetter("importance")
sorted_pets = sorted(
pets,
key=key,
reverse=True
)
print("Рейтинг по ЧСВ:")
print(sorted_pets)
Рейтинг по ЧСВ:
[Френк, Клер, Зоя]
Френк ожидаемо победил в обеих номинациях. Чёртова птица.