Самый быстрый способ, особенно если в вашем списке много записей, - использовать operator.attrgetter("count"). Однако это может выполняться в предоперационной версии Python, поэтому было бы неплохо иметь запасной механизм. Тогда вы можете захотеть выполнить следующее:
try: import operator except ImportError: keyfun= lambda x: x.count # use a lambda if no operator module else: keyfun= operator.attrgetter("count") # use operator since it's faster than lambda
ut.sort(key=keyfun, reverse=True) # sort in-place
Ответ 3
Читатели должны заметить, что ключ = метод:
ut.sort(key=lambda x: x.count, reverse=True)
это во много раз быстрее, чем добавление расширенных операторов сравнения к объектам. Я был удивлен, прочитав это (страница 485 "Python в двух словах"). Вы можете подтвердить это, запустив тесты в этой небольшой программе.:
Мои, самые минимальные, тесты показывают, что первая сортировка выполняется более чем в 10 раз медленнее, но в книге говорится, что в целом она всего примерно в 5 раз медленнее. Причина, по которой они говорят, заключается в высокооптимизированном алгоритме сортировки, используемом в python (timsort).
Тем не менее, очень странно, что .sort(лямбда) работает быстрее, чем обычный старый .sort() . Надеюсь, они это исправят.
Ответ 4
Объектно-ориентированный подход
Рекомендуется сделать логику сортировки объектов, если применимо, свойством класса, а не включать в каждый экземпляр, порядок которого требуется.
Это обеспечивает согласованность и устраняет необходимость в шаблонном коде.
Как минимум, вы должны указать операции __eq__ и __lt__, чтобы это сработало. Затем просто используйте sorted(list_of_objects).