История вопроса:
С самого начала язык Python предоставлял встроенные инструменты для сортировки коллекций. Методы sort() и функция sorted() появились во второй версии Python, но начиная с Python 2.4, sorted() была введена как универсальное средство сортировки любых итерируемых объектов (не только списков).
Проблема:
Часто требуется отсортировать данные по разным критериям и не всегда хочется менять исходный объект. Новички путают sort() и sorted(), не понимают, где применяется каждый, и делают ошибки с ключом сортировки и обратным порядком.
Решение:
sorted(итерируемый_объект, key=None, reverse=False) всегда возвращает новый объект-список, не изменяя исходный.list.sort(key=None, reverse=False) сортирует сам список по месту (in-place) и возвращает None.key — функция, определяющая, по какому критерию сортировать.reverse=True меняет порядок на обратный.Пример сортировки списка строк по их длине, в обратном порядке:
words = ['python', 'is', 'strong', 'language'] sorted_words = sorted(words, key=len, reverse=True) print(sorted_words) # ['language', 'python', 'strong', 'is']
Ключевые особенности:
Что возвращает метод sort()?
Метод list.sort() сортирует сам список и всегда возвращает None, что часто забывают.
lst = [3, 1, 2] res = lst.sort() print(res) # None print(lst) # [1, 2, 3]
Можно ли отсортировать кортеж с помощью sort()?
Нельзя, кортежи неизменяемые, у них нет метода .sort(). Для сортировки используйте sorted().
tuple_data = (5,2,3) sorted_tuple = sorted(tuple_data) print(sorted_tuple) # [2, 3, 5]
Что будет, если в key указать функцию, возвращающую разные типы?
Будет исключение TypeError, если возвращаемые значения несравнимы между собой (например, int и str).
На собеседовании просят вернуть отсортированный по длине список, а кандидат делает:
lst = ['one', 'elephant'] ans = lst.sort(key=len) print(ans) # None
Плюсы:
Минусы:
Правильное использование:
lst = ['one', 'elephant'] ans = sorted(lst, key=len) print(ans) # ['one', 'elephant']
Плюсы:
Минусы: