Сортировка по ключу, распаковка и вопросы про сложность
Заключительный практический урок: сортировка по ключу, распаковка и как отвечать про сложность.
Параметр
keyуsortedзадаёт, по какому признаку сравнивать элементы — это самый частый инструмент для нетривиальной сортировки.
Сортировка с key
Чёткий ответ. sorted(data, key=func) сортирует по значению func(элемент), не меняя сами элементы. Для убывания добавляют reverse=True.
people = [("Аня", 30), ("Боб", 25), ("Ева", 35)]
print(sorted(people, key=lambda p: p[1])) # по возрасту
print(sorted(people, key=lambda p: p[1], reverse=True))
words = ["banana", "kiwi", "apple", "fig"]
print(sorted(words, key=len)) # по длине
Вывод:
[('Боб', 25), ('Аня', 30), ('Ева', 35)]
[('Ева', 35), ('Аня', 30), ('Боб', 25)]
['fig', 'kiwi', 'apple', 'banana']
Распаковка через звёздочку
Звёздочка в присваивании «забирает» лишние элементы в список. Удобно отделять первый/последний элемент от остальных, а ** — объединять словари.
first, *middle, last = [1, 2, 3, 4, 5]
print(first, middle, last)
a, b = 1, 2
a, b = b, a # обмен без временной переменной
print(a, b)
base = {"x": 1, "y": 2}
merged = {**base, "z": 3} # объединение словарей
print(merged)
Вывод:
1 [2, 3, 4] 5
2 1
{'x': 1, 'y': 2, 'z': 3}
Что спрашивают про сложность
Финальный частый вопрос — назвать асимптотику типовых операций. Держите эту шпаргалку в голове:
| Операция | Сложность |
доступ list[i], dict[k], k in set | O(1) |
x in list, list.insert(0, x) | O(n) |
sorted(...), list.sort() | O(n log n) |
| вложенный цикл по всем парам | O(n²) |
# sorted — O(n log n), членство в set — O(1)
nums = [5, 2, 9, 1, 7]
print(sorted(nums))
print(9 in set(nums))
Вывод:
[1, 2, 5, 7, 9] True
Итог
sorted(data, key=func)сортирует по признаку;reverse=True— по убыванию.- Звёздочка в распаковке забирает лишние элементы;
a, b = b, aменяет местами;{**d}объединяет словари. - Знайте Big-O базовых операций: доступ к dict/set — O(1),
x in list— O(n), сортировка — O(n log n).
Проверьте себя
1. Что делает параметр key в sorted?
AШифрует данные
BЗадаёт признак, по которому сравнивать элементы
CУдаляет дубликаты
DМеняет тип результата
2. Что получит middle в first, *middle, last = [1,2,3,4,5]?
A1
B5
C[2, 3, 4]
D[1, 2, 3, 4, 5]
3. Какая сложность у sorted(list)?
AO(1)
BO(n)
CO(n log n)
DO(n²)