Python

Сортировка списка в Python: sort, sorted и key

Сортировка списка нужна для чисел, строк, дат, цен, рейтингов и объектов. В Python есть два основных варианта: sorted() возвращает новый список, а .sort() меняет исходный

По этой теме полезно отдельно посмотреть Составьте еженедельное расписание занятий, чтобы расширить контекст и сравнить подходы

По этой теме полезно отдельно посмотреть Аннотации типов для декораторов в Python, чтобы расширить контекст и сравнить подходы

sorted возвращает новый список

numbers = [5, 1, 10, 3]

result = sorted(numbers)

print(numbers)
print(result)

Так безопаснее, если исходный порядок еще нужен

sort меняет список на месте

numbers = [5, 1, 10, 3]

numbers.sort()

print(numbers)

Метод ничего не возвращает, поэтому не пишите result = numbers.sort()

Обратный порядок

scores = [80, 95, 70]

print(sorted(scores, reverse=True))

reverse=True полезен для рейтингов и топов

key для сортировки строк и словарей

words = ["python", "go", "javascript"]
print(sorted(words, key=len))

products = [
    {"title": "Чай", "price": 420},
    {"title": "Кофе", "price": 790},
]

print(sorted(products, key=lambda product: product["price"]))

key говорит Python, по какому признаку сравнивать элементы

Второй признак сортировки

users = [
    {"name": "Анна", "score": 90},
    {"name": "Илья", "score": 90},
    {"name": "Мария", "score": 80},
]

result = sorted(users, key=lambda user: (-user["score"], user["name"]))
print(result)

Сначала сортируем по баллам по убыванию, потом по имени

Как проверять себя

Проверьте обычный список, пустой список, список из одного элемента и данные с повтором. Если в задаче есть индекс, отдельно проверьте слишком короткий список. Если есть изменение на месте, выведите исходные данные до и после операции

Сортировка списка словарей

key особенно полезен, когда нужно сортировать не простые числа, а записи с полями

products = [
    {"title": "Кофе", "price": 790},
    {"title": "Чай", "price": 350},
    {"title": "Какао", "price": 520},
]

by_price = sorted(products, key=lambda product: product["price"])
print(by_price)

Если нужно отсортировать по двум признакам, верните из key кортеж

products = sorted(products, key=lambda product: (product["price"], product["title"]))
print(products)

Короткий пример с пропущенной ценой

items = [{"name": "A", "price": 10}, {"name": "B"}, {"name": "C", "price": 5}]

result = sorted(items, key=lambda item: item.get("price", 0))
print(result)

Заранее решите, куда ставить записи без цены: в начало, в конец или отдельный список для проверки

Частые ошибки

Путать номер элемента и индекс

Первый элемент имеет индекс 0, второй — индекс 1, третий — индекс 2

Менять список там, где нужен новый результат

Если исходные данные еще пригодятся, используйте новый список или sorted(), а не изменение на месте

Не проверять пустые данные

Пустой список часто ломает pop, choice, обращение по индексу и вычисление среднего значения

Сортировка с пропущенными значениями

В реальных данных поле для сортировки может отсутствовать. Тогда используйте get, но выбирайте запасное значение осознанно

products = [
    {"title": "Кофе", "price": 250},
    {"title": "Чай"},
    {"title": "Сок", "price": 180},
]

result = sorted(products, key=lambda product: product.get("price", 0))
print(result)

Если товар без цены должен быть в конце, запасное значение лучше сделать большим, например 10**9. Сортировка должна отражать смысл задачи, а не просто не падать

Ошибка с sort, которую часто делают

numbers = [3, 1, 2]

result = numbers.sort()

print(result)
print(numbers)

sort() меняет исходный список и возвращает None. Если нужен новый список, используйте sorted(numbers). Если можно менять исходные данные, используйте numbers.sort(). Эта разница особенно важна, когда один и тот же список дальше используется в нескольких местах программы

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

Настройки cookie

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