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

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x