Pull to refresh

Comments 15

Один вопрос. Как отсортировать с помощью key по двум ключам в разном порядке?
Например, по ключу age по возрастанию а по name по убыванию?
Начинать городить на выходе tuple вида (-age, name)?
Так и приходится:
key = lambda obj: (obj.age, -obj.iq, obj.weight)
А теперь что делать если два поля в разную сторону — текстовые.
Такая сортировка — это уже целая фича, и было бы странно, если бы стандартная библиотека предоставляла такие возможности.

Один из вариантов реализации — определить rich compasion методы для объекта. Если критерии сортировки меняются — перед каждой сортировкой обвёртывать в объект с нужной конфигурацией сравнения.
Эта фича была в стандартной библиотеке, пока не выпилили cmp :)))
Ну, выпилили и выпилили. Светлая ей память. А стандартная библиотека стала только лучше от этого.
Оно-оно, знаю. Просто уровень магии и извращения в питоне растёт версия от версии.
Спасибо большое за информацию. Похоже 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)]
в тесте 02 должно быть lst.sort(key=opr)
в тесте 12 локилизация opr заметно ускорит дело
Пример

def with_op(lst):
lst.sort(key=itemgetter('name'))


неправильный, должно быть itemgetter('id'), возможно, оно будет медленнее
Но быстрее, чем с key=lambda x: x['id'] ( т. е. lst.sort(key=operator.itemgetter('id')) быстрее выполняется, чем lst.sort(key=lambda x: x['id']) )
Да, Вы правы, там опечатка. Исправленный вариант в 2-3 раза медленнее.
Sign up to leave a comment.

Articles