Сортировка по ключу, распаковка и вопросы про сложность

Заключительный практический урок: сортировка по ключу, распаковка и как отвечать про сложность.

Параметр 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 setO(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²)
Поддержать проект