← Назад к вопросам

Что общего у словаря и множества?

2.0 Middle🔥 141 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что общего у словаря и множества

Словари и множества в Python похожи больше, чем кажется на первый взгляд. Давайте разберёмся в их общих характеристиках.

Основные сходства

1. Обе используют хеширование

И словари, и множества используют хеш-таблицу для хранения элементов. Это даёт им O(1) скорость поиска:

# Проверка принадлежности
my_dict = {"a": 1, "b": 2, "c": 3}
my_set = {"a", "b", "c"}

print("a" in my_dict)  # O(1) — очень быстро
print("a" in my_set)   # O(1) — очень быстро

# Против списка:
my_list = ["a", "b", "c"]
print("a" in my_list)  # O(n) — медленнее

2. Требуют неизменяемых ключей/элементов

Ключи в словаре и элементы множества должны быть неизменяемыми (hashable):

# Правильно
my_dict = {(1, 2): "value"}  # Кортеж как ключ
my_set = {(1, 2), (3, 4)}    # Кортежи как элементы

# Неправильно
# my_dict = {[1, 2]: "value"}  # TypeError: unhashable type
# my_set = {[1, 2], [3, 4]}    # TypeError: unhashable type

3. Неупорядоченные (до Python 3.7)

До Python 3.7 оба типа были неупорядочены. Сейчас словари упорядочены (сохраняют порядок вставки), множества остаются неупорядоченными:

my_dict = {"z": 1, "a": 2, "m": 3}
my_set = {3, 1, 2}

print(list(my_dict.keys()))  # ['z', 'a', 'm'] — порядок сохранён
print(my_set)                # {1, 2, 3} — порядок случаен

4. Оба изменяемы (mutable)

Вы можете изменять и словари, и множества после создания:

my_dict = {"a": 1}
my_dict["b"] = 2  # Добавить ключ-значение

my_set = {1, 2}
my_set.add(3)     # Добавить элемент

5. Нельзя использовать как элементы другого множества/ключи словаря

Потому что они изменяемы:

my_dict = {"a": 1}
my_set = {1, 2}

# Невозможно
# nested_dict = {my_dict: "value"}  # TypeError
# nested_set = {my_set, my_dict}    # TypeError

# Нужно использовать frozenset/frozendict
frozen_set = frozenset([1, 2])
some_dict = {frozen_set: "value"}  # OK

6. Итерируются быстро

Оба итерируются за O(n) времени:

my_dict = {"a": 1, "b": 2}
my_set = {1, 2, 3}

for key in my_dict:  # O(n)
    print(key)

for element in my_set:  # O(n)
    print(element)

7. Реализованы через хеш-таблицу

# Внутри Python:
# dict: {hash(key): value}
# set: {hash(element): element}

Различия

# Словарь хранит пары ключ-значение
my_dict = {"name": "John", "age": 30}
print(my_dict["name"])  # John

# Множество хранит только значения
my_set = {"John", 30}
print(my_set)  # {"John", 30}

# Множество гарантирует уникальность
my_set = {1, 1, 1}  # {1}
my_dict = {"a": 1, "a": 2}  # {"a": 2} — последний перезаписывает

Множество как словарь без значений

Действительно, множество можно воспринимать как словарь, где ключи — это элементы, а значений нет:

# Это эквивалентно
my_set = {1, 2, 3}
my_dict_equivalent = {1: None, 2: None, 3: None}

# Проверка принадлежности
print(1 in my_set)  # True
print(1 in my_dict_equivalent)  # True

# Но в множестве нет значений
print(my_set[1])  # TypeError

Практический пример

# Используем оба вместе
users_with_emails = {"john@mail.com": "John", "jane@mail.com": "Jane"}
blocked_users = {"john@mail.com", "bob@mail.com"}

# Получить активные пользователей
active_users = {
    email: name 
    for email, name in users_with_emails.items()
    if email not in blocked_users
}
print(active_users)  # {'jane@mail.com': 'Jane'}

Итог

Словари и множества:

  • Используют хеширование (O(1) поиск)
  • Требуют неизменяемые элементы
  • Изменяемы сами
  • Не упорядочены (по крайней мере множества)
  • Быстро итерируются
  • Словарь можно рассматривать как множество с добавленными значениями
Что общего у словаря и множества? | PrepBro