$ sudo teach IT
Модуль 5 · Коллекции · Урок 5.9

Практикум: коллекции

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

Практика~30 минутНовичок

За восемь уроков вы разобрали список, кортеж, словарь и множество по отдельности. Пришло время посмотреть на них рядом и понять, когда какой выбирать. Новой теории здесь почти нет — сводная таблица, разбор ошибок на стыке этих типов и шесть задач, где решать нужно ещё и с самого начала: какая коллекция вообще подходит.

Частые ошибки на стыке коллекций

Присвоили список другой переменной и решили, что скопировали его

original = [1, 2, 3]
copy_attempt = original
copy_attempt.append(4)

print(original)   # [1, 2, 3, 4] -- изменился и оригинал!
Ловушка: список — изменяемый тип, а строка copy_attempt = original не копирует список, а даёт второй ярлык на тот же объект. Изменение через один ярлык видно и через другой. Для независимой копии берите original.copy() или original[:]. Со строкой, числом или кортежем так не ошибиться: они неизменяемые.

Обратились к несуществующему ключу словаря

scores = {"Алия": 5, "Борис": 4}
print(scores["Вера"])   # KeyError: 'Вера'
Ловушка: квадратные скобки требуют, чтобы ключ точно существовал, иначе — KeyError. Если ключа может не быть, используйте scores.get("Вера"): он вернёт None вместо падения, а scores.get("Вера", 0) — значение по умолчанию.

Пытаются обратиться к множеству по индексу

unique_ids = {101, 205, 103}
print(unique_ids[0])   # TypeError: 'set' object is not subscriptable
У множества нет порядка, а значит нет и понятия «первый элемент» — индексов set не поддерживает. Если порядок нужен, множество превращают в список: sorted(unique_ids) или list(unique_ids).

Сводная таблица: список, кортеж, словарь, множество

Все четыре типа в одной таблице — удобно сверяться при выборе коллекции.

Тип Пример создания Изменяемый? Есть порядок? Дубликаты? Когда использовать
list x = [1, 2, 3] да да да Коллекция, которую будете менять: добавлять, удалять, сортировать
tuple x = (1, 2, 3) нет да да Фиксированный набор значений, который нельзя случайно испортить: координаты, дата, запись
dict x = {"a": 1} да да* ключи — нет Данные с именованными полями: слово → количество, имя → телефон
set x = {1, 2, 3} да нет нет Уникальные значения и быстрая проверка «уже встречалось?»

* словарь хранит пары в том порядке, в котором их добавили

Приём: убираем дубликаты, сохраняя порядок

Любой из четырёх типов превращается в другой: list(x), tuple(x), set(x). Самый частый повод — убрать повторы через set(x), но у него есть недостаток: порядок не сохраняется, и после list(set(names)) элементы могут перемешаться. Если порядок важен, дубликаты убирают циклом с дополнительным множеством для проверки:

names = ["Анна", "Борис", "Анна", "Вера", "Борис"]

seen = set()
unique_in_order = []
for name in names:
    if name not in seen:
        unique_in_order.append(name)
        seen.add(name)

print(unique_in_order)   # ['Анна', 'Борис', 'Вера']
seen = set() — пустое множество: сюда складываем уже увиденные имена. Проверка in у множества быстрее, чем у списка.
unique_in_order = [] — пустой список для результата: без повторов, в исходном порядке.
for name in names: — перебираем исходный список по одному имени, в исходном порядке.
if name not in seen: — если имени в seen ещё нет, встречаем его впервые.
unique_in_order.append(name) и seen.add(name) — добавляем имя в результат и отмечаем его в множестве, чтобы не добавить второй раз.

Программа выведет ['Анна', 'Борис', 'Вера'] — в порядке первого появления. Второй «Борис» отсеялся: он уже был в seen.

Что важно запомнить

list, dict, set — изменяемые: append или присваивание по ключу меняют тот же объект. tuple — неизменяемый.
b = a для списка или словаря не копирует его, а даёт второй ярлык. Для копии нужен a.copy() или a[:].
Обращение к несуществующему ключу через квадратные скобки вызывает KeyError. Когда ключа может не быть — используйте .get().
У множества нет порядка и индексов: оно для уникальных значений и быстрой проверки, а не для доступа по номеру.
Чтобы убрать дубликаты и сохранить порядок, перебирайте список циклом, ведя рядом множество уже встреченных значений.

Проверьте себя

6 вопросов

Приведение типов

Дан список чисел data (в нём есть повторы). Преобразуйте его в кортеж, множество и обратно в список:

  • tpl — кортеж из тех же чисел, что и в data, в том же порядке, с повторами
  • st — множество уникальных чисел из data
  • lst — список, построенный из множества st (то есть уникальные числа, уже без повторов)

Например, если data = [1, 1, 2], то tpl должен быть (1, 1, 2), а st — {1, 2}.

Анаграммы

Premium

Общие отличники

Premium

Группировка по первой букве

Premium

Частотный словарь

Premium

Топ-3 самых частых слова

Premium