📖 Теория

⚡ Кратко: теория

Set comprehension создаёт множество из выражения, цикла и необязательного условия.

frozenset - неизменяемый аналог set, поэтому его можно использовать как ключ словаря или элемент другого множества.

Словарь хранит пары ключ-значение; ключ должен быть уникальным и хешируемым.

dict() создаёт словарь из именованных аргументов или последовательности пар.

Доступ через dictionary[key] быстрый, но отсутствующий ключ вызывает KeyError.

Оператор in проверяет наличие ключа, а не значения.

update() добавляет новые пары и перезаписывает существующие ключи.

del и pop() удаляют по ключу; pop() ещё возвращает удалённое значение.

Топ-3 ошибки: создавать пустое множество через {}, хотя это пустой dict; использовать list или set как ключ словаря; читать отсутствующий ключ через [] без проверки.

Set comprehension

Set comprehension работает как list comprehension, но результатом становится множество: дубликаты исчезают, а порядок вывода не гарантируется.

words = ["apple", "banana", "cherry", "apple"]
unique_lengths = {len(word) for word in words}
print(unique_lengths)

В примере длины слов равны 5 и 6, поэтому в множестве останутся только эти два значения.

frozenset

frozenset создаётся одноимённой функцией и после создания не поддерживает add(), remove(), discard(), pop() и clear().

immutable_set = frozenset([1, 2, 3, 4, 5])
print(immutable_set)

immutable_from_range = frozenset(range(5))
print(immutable_from_range)

Так как frozenset неизменяемый и хешируемый, его можно положить в set или использовать как ключ словаря.

frozen_set1 = frozenset([1, 2, 3])
frozen_set2 = frozenset([4, 5, 6])
set_of_frozensets = {frozen_set1, frozen_set2}
print(set_of_frozensets)

Словарь и ключи

Словарь хранит пары ключ-значение. Ключи уникальны: если добавить уже существующий ключ, старое значение будет заменено новым.

person = {"name": "Alice", "age": 30, "city": "New York"}
person["age"] = 31
print(person)

Ключ должен быть хешируемым: подходят строки, числа, кортежи из хешируемых объектов и frozenset; списки, обычные set и dict не подходят.

same_key = {1.0: "float", 1: "integer", True: "boolean"}
print(same_key)

В Python значения 1, 1.0 и True равны при сравнении и имеют совместимое поведение для хеширования, поэтому в одном словаре они считаются одним ключом.

Преобразование в словарь и доступ

dict() принимает последовательность пар. Каждая внутренняя коллекция должна содержать ровно два элемента: ключ и значение.

pairs = [("name", "Charlie"), ("age", 35), ("city", "Paris")]
person = dict(pairs)
print(person["name"])

Если ключ отсутствует, квадратные скобки вызывают KeyError. На этом уроке источник предлагает проверять ключ через in.

person = {"name": "Alice", "age": 30}
if "city" in person:
    print(person["city"])
else:
    print("Город не указан")

Добавление, обновление и удаление

Присваивание по новому ключу добавляет пару, присваивание по существующему ключу обновляет значение.

user = {"name": "Alice", "age": 30}
user["city"] = "New York"
user.update({"age": 32, "country": "USA"})
print(user)

del удаляет ключ без возврата значения. pop() удаляет и возвращает значение. popitem() удаляет последнюю добавленную пару в современных версиях Python.

user = {"name": "Alice", "age": 30, "city": "New York"}
age = user.pop("age")
print(age)
print(user)
Проверить по документации: Уточнение про порядок словаря и поведение popitem() относится к современной практике Python 3.7+.