В чём разница между методами sort() и функцией sorted() в Python?

«В чём разница между методами sort() и функцией sorted() в Python?» — вопрос из категории Python, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Основное отличие заключается в том, что list.sort() — это метод, изменяющий исходный список (in-place), а sorted()встроенная функция, возвращающая новый отсортированный список.

1. list.sort() (in-place сортировка):

  • Изменяет исходный список. После вызова my_list.sort() порядок элементов в my_list меняется.
  • Возвращает None. Это важный момент, который может привести к ошибкам, если ожидается возврат списка.
  • Применим только к спискам (list).

2. sorted() (функция, создающая новую последовательность):

  • Не изменяет исходную коллекцию. Возвращает новый отсортированный список.
  • Работает с любым итерируемым объектом: списки, кортежи, строки, словари (вернёт список ключей), генераторы.
  • Всегда возвращает список (list). Даже если на входе был кортеж или строка.

Примеры:

# Исходные данные
my_list = [3, 1, 4, 1, 5]
my_tuple = (9, 2, 6)
my_string = "python"

# Использование list.sort()
my_list.sort()
print(my_list)  # Вывод: [1, 1, 3, 4, 5]
# Метод sort() ничего не возвращает (None)
result = my_list.sort()
print(result)   # Вывод: None

# Использование sorted()
sorted_list = sorted(my_list)   # Создаёт новый список
print(sorted_list)              # Вывод: [1, 1, 3, 4, 5]
print(my_list)                  # Исходный список не изменился: [1, 1, 3, 4, 5]

sorted_tuple = sorted(my_tuple) # Возвращает список!
print(sorted_tuple)             # Вывод: [2, 6, 9]
print(type(sorted_tuple))       # Вывод: <class 'list'>

sorted_chars = sorted(my_string)
print(sorted_chars)             # Вывод: ['h', 'n', 'o', 'p', 't', 'y']

Общие параметры (и для sort(), и для sorted()):

  • key: Функция, определяющая ключ сортировки (например, key=len для сортировки по длине).
  • reverse: Булев флаг для сортировки по убыванию (reverse=True).
# Сортировка списка строк по длине
words = ['apple', 'fig', 'banana', 'date']
sorted_by_len = sorted(words, key=len)
print(sorted_by_len)  # Вывод: ['fig', 'date', 'apple', 'banana']

words.sort(key=len, reverse=True)
print(words)          # Вывод: ['banana', 'apple', 'date', 'fig'] (исходный список изменён)

Практическое правило: Использую sorted(), когда нужно сохранить исходный порядок данных или отсортировать не-список. Использую list.sort(), когда нужно эффективно отсортировать именно список и исходный порядок не важен.