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

Ответ

Основное отличие заключается в том, что 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(), когда нужно эффективно отсортировать именно список и исходный порядок не важен.

Ответ 18+ 🔞

А, ну это классика, ёпта! Сидишь такой, пишешь код, и тут бац — нужно список отсортировать. И тут у тебя два пути, как в той сказке: налево пойдёшь — sort() найдёшь, направо пойдёшь — sorted() получишь. А разница между ними — овердохуища, хотя на первый взгляд кажется, что одно и то же.

Смотри сюда, главное не перепутай, а то будет тебе хиросима и нигерсраки.

list.sort() — это как взять и переставить мебель в комнате.

  • Ломает всё к хуям. Вызвал moy_spisok.sort() — и всё, приехали. Исходный список теперь навсегда изменён, элементы переставлены.
  • Возвращает нихуя. Серьёзно, None. Это ловушка для новичков! Если ты попробуешь new_list = old_list.sort(), то в new_list окажется пустота, а old_list будет отсортирован. Сам от себя охуеешь, когда это поймёшь.
  • Работает ТОЛЬКО со списками. Попробуй применить к кортежу — получишь в лучшем случае ошибку, в худшем — волнение ебать.

sorted() — это как сфоткать комнату, а потом в Фотошопе мебель по-другому расставить.

  • Исходник не трогает. Он такой хитрая жопа: взял твою коллекцию, отсортировал и вернул тебе НОВЫЙ список. Старый остался как был, хоть ты тресни.
  • Жрёт что угодно. Ему дай список, кортеж, строку, ключи словаря — он всё проглотит и новый список выплюнет.
  • Всегда возвращает список. Даже если ты ему строку "python" скормил, он вернёт тебе ['h', 'n', 'o', 'p', 't', 'y']. Чистая магия, ёбана!

Примеры, чтобы совсем пиздец всё стало ясно:

# Исходники
spisok = [3, 1, 4, 1, 5]  # Любимые цифры
kortezh = (9, 2, 6)       # Несчастный кортеж
stroka = "python"         # Просто строка

# Творим дичь с list.sort()
spisok.sort()  # Безвозвратно меняем spisok
print(spisok)  # Вывод: [1, 1, 3, 4, 5] — всё, поезд ушёл
resultat = spisok.sort()
print(resultat) # Вывод: None — вот тебе и результат, хуй с горы!

# Работаем как цивилизованные люди с sorted()
noviy_spisok = sorted(spisok) # Создаём новый объект
print(noviy_spisok)           # Вывод: [1, 1, 3, 4, 5]
print(spisok)                 # А старый всё ещё [1, 1, 3, 4, 5] — доверия ебать ноль, но работает!

sorted_kortezh = sorted(kortezh) # Пытаемся отсортировать кортеж
print(sorted_kortezh)            # Вывод: [2, 6, 9] — видишь? СПИСОК!
print(type(sorted_kortezh))      # Вывод: <class 'list'> — я же говорил!

sorted_bukvy = sorted(stroka)
print(sorted_bukvy)              # Вывод: ['h', 'n', 'o', 'p', 't', 'y'] — разобрал по буквам, пидарас шерстяной!

А есть же ещё и общие плюшки! И у sort(), и у sorted() есть два крутых параметра: key и reverse.

  • key — это такая функция, которая говорит, ПО ЧЕМУ сортировать. Например, key=len — значит, сортируй по длине.
  • reverse=True — это когда хочешь не по возрастанию, а по убыванию. Всё просто, как три копейки.
# Сортируем слова по их длине, ёпта
slova = ['арбуз', 'киви', 'банан', 'яблоко']
sortirovka_po_dline = sorted(slova, key=len)
print(sortirovka_po_dline)  # Вывод: ['киви', 'арбуз', 'банан', 'яблоко'] — 'киви' короче всех

# А теперь нагло меняем исходный список в обратном порядке по длине
slova.sort(key=len, reverse=True)
print(slova)  # Вывод: ['яблоко', 'арбуз', 'банан', 'киви'] — исходный список накрылся медным тазом, он теперь другой!

Итог, чувак: Если тебе не жалко исходный список и ты хочешь сделать всё быстро и в памяти — list.sort(). Если тебе нужно сохранить оригинал или отсортировать что-то, что не список (кортеж, строку) — sorted(). Выбирай с умом, а то потом сидишь и думаешь: "какого хуя у меня данные перепутались?".