Код: Выделить всё
class Person:
def __init__(self, name: str, age: int):
self.name = name
self.age = age
def __repr__(self) -> str:
return f"({self.name}, {self.age})"
Код: Выделить всё
persons = [
Person("Bob", 25),
Person("Alice", 25),
Person("Charlie", 23),
Person("Dave", 25),
]
Я могу отсортировать список по возрасту в порядке возрастания, а в случае равенства — по имени в порядке возрастания, используя следующий метод:
р>
Код: Выделить всё
sorted_persons = sorted(persons, key=lambda p: (p.age, p.name))
Однако я ищу способ отсортировать список по возрасту в порядке возрастания и в совпадение по возрасту, сортировка по имени в порядке убывания. Как я мог добиться этого в Python?
Я придумал одно решение, как показано ниже, но оно кажется немного неэлегантным. Есть ли более краткий способ написать метод сравнения строк, который может обрабатывать все три случая (т. е. меньше, равно и больше)? Например, в Java есть метод s1.compareTo(s2), который упрощает такое сравнение.
Вот решение, над которым я сейчас работаю:
Код: Выделить всё
from functools import cmp_to_key
def compare(p1, p2):
cmp = p1.age - p2.age
if cmp != 0:
return cmp
if p1.name < p2.name:
return 1
elif p1.name > p2.name:
return -1
return 0
sorted_persons = sorted(persons, key=cmp_to_key(compare))
Подробнее здесь: https://stackoverflow.com/questions/767 ... -different