Comments 15
Один вопрос. Как отсортировать с помощью key по двум ключам в разном порядке?
Например, по ключу age по возрастанию а по name по убыванию?
Начинать городить на выходе tuple вида (-age, name)?
Например, по ключу age по возрастанию а по name по убыванию?
Начинать городить на выходе tuple вида (-age, name)?
Так и приходится:
key = lambda obj: (obj.age, -obj.iq, obj.weight)
key = lambda obj: (obj.age, -obj.iq, obj.weight)
А теперь что делать если два поля в разную сторону — текстовые.
Такая сортировка — это уже целая фича, и было бы странно, если бы стандартная библиотека предоставляла такие возможности.
Один из вариантов реализации — определить rich compasion методы для объекта. Если критерии сортировки меняются — перед каждой сортировкой обвёртывать в объект с нужной конфигурацией сравнения.
Один из вариантов реализации — определить rich compasion методы для объекта. Если критерии сортировки меняются — перед каждой сортировкой обвёртывать в объект с нужной конфигурацией сравнения.
Спасибо большое за информацию. Похоже key вычисляется один на элемент в первом проходе, а далее сортировка одних лишь ключей происходит, а cmp вызывается многократно для каждого конкретного элемента при сравнении его с другими.
Python 2.7.2
>>>ls = [(1,2,3), (2,1,3), (2,3,1)]
>>>ls.sort(key=reversed)
>>>ls
>>>[(1, 2, 3), (2, 1, 3), (2, 3, 1)]
>>>ls = [(1,2,3), (2,1,3), (2,3,1)]
>>>ls.sort(key=reversed)
>>>ls
>>>[(1, 2, 3), (2, 1, 3), (2, 3, 1)]
>> На ночь глядя


Пример
неправильный, должно быть itemgetter('id'), возможно, оно будет медленнее
def with_op(lst):
lst.sort(key=itemgetter('name'))
неправильный, должно быть itemgetter('id'), возможно, оно будет медленнее
Sign up to leave a comment.
Сортировки: key vs cmp