Python
Как отсортировать список в Python
Список в Python сортируют двумя основными способами: sort меняет исходный список, а sorted возвращает новый. Выбор зависит от того, нужно ли сохранить исходный порядок
Разберем сортировку так, чтобы было понятно, когда использовать sorted, когда sort, как сортировать строки, числа и словари, и почему исходный список иногда должен остаться без изменений
Базовый пример
Сортировка чисел:
numbers = [5, 2, 9, 1]
print(sorted(numbers))
print(numbers)
sorted(numbers) вернул новый список, а numbers остался прежним
Разбор по шагам
sorted(numbers) возвращает новый список и не трогает исходный. Это удобно, если старый порядок еще нужен: например, вы показываете товары в исходном порядке, а рядом строите отдельный список по цене
numbers.sort() сортирует список на месте и возвращает None. Его выбирают, когда исходный порядок больше не важен. Если нужно сортировать словари или объекты, добавьте key: именно он говорит Python, по какому полю сравнивать элементы
По этой теме полезно отдельно посмотреть Составьте еженедельное расписание занятий, чтобы расширить контекст и сравнить подходы
По этой теме полезно отдельно посмотреть Аннотации типов для декораторов в Python, чтобы расширить контекст и сравнить подходы
Практические варианты
Сортировка на месте
numbers = [5, 2, 9, 1]
numbers.sort()
print(numbers)
Сортировка словарей по цене
products = [
{'title': 'book', 'price': 900},
{'title': 'keyboard', 'price': 2500},
]
products_sorted = sorted(products, key=lambda item: item['price'])
print(products_sorted)
Частые ошибки
Частые ошибки: ждать новый список от sort, забывать key для словарей, не понимать разницу между сортировкой строк и чисел
Как проверить результат
- запустить код на обычном примере
- проверить пустой список
- проверить список из одного элемента
- проверить повторы
- объяснить, меняется исходный список или создается новый
- вынести действие в функцию, если оно повторяется
Сортировка по убыванию
numbers = [5, 2, 9, 1]
print(sorted(numbers, reverse=True))
reverse=True разворачивает порядок сортировки. Для строк это тоже работает, но порядок будет алфавитный
Сортировка строк без учета регистра
names = ["anna", "Bob", "maria"]
print(sorted(names, key=str.lower))
Без key=str.lower заглавные и строчные буквы могут дать неожиданный порядок
Сортировка списка словарей
users = [
{"name": "Анна", "age": 25},
{"name": "Илья", "age": 19},
]
by_age = sorted(users, key=lambda user: user["age"])
print(by_age)
Проверьте, что будет, если у одного словаря нет ключа age. В рабочем коде для таких случаев используют get или заранее чистят данные
Практика на закрепление
Практический сценарий — отсортировать товары по цене и по названию
products = [
{"title": "Книга", "price": 900},
{"title": "Клавиатура", "price": 2500},
{"title": "Мышь", "price": 1200},
]
by_price = sorted(products, key=lambda product: product["price"])
by_title = sorted(products, key=lambda product: product["title"])
print(by_price)
print(by_title)
Если нужен обратный порядок, добавьте reverse=True
expensive_first = sorted(products, key=lambda product: product["price"], reverse=True)
print(expensive_first)
Проверьте два товара с одинаковой ценой. Python сохранит стабильность сортировки: элементы с равным ключом останутся в исходном относительном порядке. Это полезно, когда перед сортировкой данные уже были упорядочены по другому признаку
Практика: сортировка каталога товаров
Сделайте функцию, которая сортирует товары по цене, но не меняет исходный список. Так легче проверить результат и не потерять исходный порядок данных
def sort_by_price(products, reverse=False):
return sorted(products, key=lambda product: product["price"], reverse=reverse)
products = [
{"title": "Книга", "price": 900},
{"title": "Клавиатура", "price": 2500},
{"title": "Мышь", "price": 1200},
]
cheap_first = sort_by_price(products)
expensive_first = sort_by_price(products, reverse=True)
print(cheap_first)
print(expensive_first)
print(products)
Проверьте товары с одинаковой ценой. Стабильная сортировка сохранит их относительный порядок, и это полезно, когда список уже был упорядочен по названию или дате добавления
Как выбрать ключ сортировки
Ключ сортировки — это функция, которая превращает каждый элемент в значение для сравнения. Для чисел ключ часто не нужен. Для словарей, строк с разным регистром и объектов без ключа не обойтись
users = [
{"name": "Анна", "score": 80},
{"name": "Илья", "score": 95},
{"name": "Мария", "score": 95},
]
rating = sorted(users, key=lambda user: user["score"], reverse=True)
print(rating)
Если у двух элементов одинаковый ключ, Python сохраняет их относительный порядок. Это называют стабильной сортировкой. Для новичка это полезно знать: одинаковые оценки или цены не будут перемешаны случайно
Сортировка чисел и строк отличается
Числа сортируются по значению, строки — посимвольно. Поэтому список ["2", "10", "1"] как строки даст не тот порядок, который ожидают от чисел
values = ["2", "10", "1"]
print(sorted(values))
print(sorted(values, key=int))
Если данные пришли из формы или файла, сначала решите, это действительно строки или числа в текстовом виде. Для чисел используйте key=int или заранее преобразуйте список. Так сортировка не будет выглядеть «странной»
Итоговая практика: сортировка без потери исходных данных
Напишите функцию, которая возвращает две версии каталога: по цене и по названию. Исходный список должен остаться прежним
def get_sorted_catalog(products):
return {
"by_price": sorted(products, key=lambda product: product["price"]),
"by_title": sorted(products, key=lambda product: product["title"].lower()),
}
products = [
{"title": "Книга", "price": 900},
{"title": "мышь", "price": 1200},
{"title": "Клавиатура", "price": 2500},
]
catalog = get_sorted_catalog(products)
print(catalog["by_price"])
print(catalog["by_title"])
print(products)
Проверьте товар с одинаковой ценой и название с заглавной буквы. Так вы увидите, зачем нужны key, reverse и отдельный новый список
Еще одна полезная проверка — посмотреть исходный список после сортировки. Если вы использовали sorted, он должен остаться прежним. Если использовали sort, порядок изменится внутри той же переменной. Новички часто путают эти варианты и потом не понимают, куда исчез исходный порядок. Поэтому в учебном коде полезно печатать оба значения рядом