Вы можете сортировать по нескольким атрибутам, если ваш ключ сортировки возвращает кортеж. В моем примере сначала мы сортируем по разнице в возрасте (более высокий приоритет), а затем по количеству домашних животных (более низкий приоритет). Вам не нужно использовать sorted
, как я, поскольку я использую его только для демонстрации работы сортировки на основе нескольких атрибутов. Вы можете использовать min
с тем же ключом, чтобы получить наиболее подходящего человека. Вы также захотите изменить assign_new_owner
, чтобы фактически назначать нового владельца (используя min
), а не печатать людей:
class Person:
def __init__(self, name, age, pets_owned):
self.name = name
self.age = age
self.pets_owned = pets_owned
def __str__(self):
return f"{self.name}, age {self.age} owns {self.pets_owned} pet(s)."
class Animal:
def __init__(self, name, age, owner=None):
self.name = name
self.age = age
self.owner = owner
def assign_new_owner(self, people):
sorted_people = sorted(people, key=lambda p: (abs(p.age - self.age), p.pets_owned))
for person in sorted_people:
print(person)
def main():
people = [
Person("Alex", 16, 0),
Person("Nigel", 15, 2),
Person("Fred", 10, 3),
Person("Tom", 10, 0),
Person("Tyler", 15, 0),
Person("Sam", 15, 1)
]
animal = Animal("Snoopy", 10)
animal.assign_new_owner(people)
return 0
if __name__ == "__main__":
import sys
sys.exit(main())
Выход:
Tom, age 10 owns 0 pet(s).
Fred, age 10 owns 3 pet(s).
Tyler, age 15 owns 0 pet(s).
Sam, age 15 owns 1 pet(s).
Nigel, age 15 owns 2 pet(s).
Alex, age 16 owns 0 pet(s).
РЕДАКТИРОВАТЬ: после использования min код может выглядеть примерно так:
class Person:
def __init__(self, name, age, pets_owned):
self.name = name
self.age = age
self.pets_owned = pets_owned
def __str__(self):
return f"{self.name}, age {self.age} owns {self.pets_owned} pet(s)."
class Animal:
def __init__(self, name, age, owner=None):
self.name = name
self.age = age
self.owner = owner
def __str__(self):
return f"{self.name}, age {self.age} is owned by {self.owner.name if self.owner else 'no one'}."
def assign_new_owner(self, people):
self.owner = min(people, key=lambda p: (abs(p.age - self.age), p.pets_owned))
def main():
people = [
Person("Alex", 16, 0),
Person("Nigel", 15, 2),
Person("Fred", 10, 3),
Person("Tom", 10, 0),
Person("Tyler", 15, 0),
Person("Sam", 15, 1)
]
animal = Animal("Snoopy", 10)
print(animal)
animal.assign_new_owner(people)
print(animal)
return 0
if __name__ == "__main__":
import sys
sys.exit(main())
Выход:
Snoopy, age 10 is owned by no one.
Snoopy, age 10 is owned by Tom.