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(). Эта разница особенно важна, когда один и тот же список дальше используется в нескольких местах программы