За восемь уроков вы разобрали список, кортеж, словарь и множество по отдельности. Пришло время посмотреть на них рядом и понять, когда какой выбирать. Новой теории здесь почти нет — сводная таблица, разбор ошибок на стыке этих типов и шесть задач, где решать нужно ещё и с самого начала: какая коллекция вообще подходит.
Частые ошибки на стыке коллекций
Присвоили список другой переменной и решили, что скопировали его
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.
Что важно запомнить
append или присваивание по ключу меняют тот же объект. tuple — неизменяемый.b = a для списка или словаря не копирует его, а даёт второй ярлык. Для копии нужен a.copy() или a[:].KeyError. Когда ключа может не быть — используйте .get().Проверьте себя
6 вопросов
Приведение типов
Дан список чисел data (в нём есть повторы). Преобразуйте его в кортеж, множество и обратно в список:
tpl— кортеж из тех же чисел, что и вdata, в том же порядке, с повторамиst— множество уникальных чисел изdatalst— список, построенный из множестваst(то есть уникальные числа, уже без повторов)
Например, если data = [1, 1, 2], то tpl должен быть (1, 1, 2), а st — {1, 2}.