Объяснение к уроку
После этого урока ты сможешь:
key функции sorted().str.lower и len.Ты уже знаешь, что sorted(values) создает отсортированный список, а list.sort() изменяет существующий список. Параметр key= в Python делает сортировку более гибкой: ключевая функция получает каждый элемент и возвращает значение, которое Python сравнивает.
sorted(names, key=str.lower)Для строк key=len упорядочивает по длине. Обрати внимание, что str.lower и len передаются как функции — без круглых скобок после их имен.
При сортировке записей напиши небольшую именованную функцию, которая принимает запись и возвращает ключ ранжирования. Ты можешь вернуть кортеж, например (priority, name), для разрешения ничьих: Python сравнивает первый элемент, а затем следующий при необходимости.
Сортировка в Python является стабильной: если два элемента имеют одинаковые ключи, они сохраняют свой исходный относительный порядок. Параметр reverse=True обращает порядок ключей; сам по себе он не решает любое смешанное требование сортировки по возрастанию и убыванию. Для таких случаев используй тщательно подобранные ключи.
labels = ["Worker", "api", "Cache"]
ordered = sorted(labels, key=str.lower)
print(ordered)Вывод:
['api', 'Cache', 'Worker']Исходный регистр сохранен; только сравнения используют нижний регистр.
routes = ["/health", "/", "/api"]
print(sorted(routes, key=len))Вывод:
['/', '/api', '/health']Функция len передается как ключевая функция, а не вызывается один раз до сортировки.
jobs = [
{"name": "backup", "duration": 40},
{"name": "sync", "duration": 10},
]
def duration_key(job):
return job["duration"]
ordered = sorted(jobs, key=duration_key)
print([job["name"] for job in ordered])Вывод:
['sync', 'backup']Ключевая функция применяется к каждой записи.
alerts = [
{"team": "Zulu", "level": 2},
{"team": "alpha", "level": 1},
{"team": "Beta", "level": 2},
]
def alert_key(alert):
return (alert["level"], alert["team"].lower())
print([item["team"] for item in sorted(alerts, key=alert_key)])Вывод:
['alpha', 'Beta', 'Zulu']Числовой уровень идет первым; имена команд в нижнем регистре разрешают ничьи по алфавиту.
| Цель | Прием |
|---|---|
| Порядок текста без учета регистра | sorted(items, key=str.lower) |
| Порядок по длине | sorted(items, key=len) |
| Сортировка словарей по полю | sorted(records, key=named_function) |
| Разрешение ничьих | Возврат кортежа из ключевой функции |
| Сохранение исходного списка | Использование sorted() вместо .sort() |
key=str.lower, а не key=str.lower(); последнее вызывает функцию без элемента.list.sort() изменяет список и возвращает None; sorted() возвращает новый список.lambda просто для сортировки нескольких записей — именованные функции работают отлично и остаются читаемыми.