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

В чём разница между set и dictionary?

1.0 Junior🔥 121 комментариев
#Python Core

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

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

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

Set vs Dictionary в Python

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

Set: Множество уникальных значений

Set — это неупорядоченная коллекция уникальных элементов без ключей:

# Создание set
my_set = {1, 2, 3, 4, 5}
empty_set = set()  # Не {}! То будет словарь

print(type(my_set))  # <class 'set'>
print(type(empty_set))  # <class 'set'>

# Основные операции
my_set.add(6)
print(my_set)  # {1, 2, 3, 4, 5, 6}

my_set.add(5)  # Дубликата — игнорируется
print(my_set)  # {1, 2, 3, 4, 5, 6} (5 только один раз)

my_set.remove(3)
print(my_set)  # {1, 2, 4, 5, 6}

print(2 in my_set)  # True (быстрая проверка O(1))
print(100 in my_set)  # False

Характеристики Set:

  • Уникальность — все элементы уникальны
  • Неупорядоченность — нет индексов
  • Изменяемость — можно добавлять/удалять
  • Скорость поиска — O(1) благодаря хешированию
  • Нет дублей — автоматически удаляются
  • Не может содержать списки (они изменяемые)

Валидные элементы Set:

valid_set = {1, 'text', (1, 2), 3.14, True}
print(valid_set)  # {1, 'text', (1, 2), 3.14}
# True == 1, поэтому останется 1

# ОШИБКА: списки не хешируются
my_set = {[1, 2, 3]}  # TypeError: unhashable type: 'list'

# ОШИБКА: словари не хешируются
my_set = {{'key': 'value'}}  # TypeError

Dictionary: Пары ключ-значение

Dictionary — это коллекция уникальных ключей с их значениями:

# Создание словаря
my_dict = {'name': 'John', 'age': 30, 'email': 'john@example.com'}
empty_dict = {}

print(type(my_dict))  # <class 'dict'>

# Основные операции
print(my_dict['name'])  # John (доступ по ключу)
print(my_dict.get('age'))  # 30

my_dict['city'] = 'New York'  # Добавление
print(my_dict)  # {'name': 'John', 'age': 30, ...}

del my_dict['email']  # Удаление
print(my_dict)  # {'name': 'John', 'age': 30, 'city': 'New York'}

print('name' in my_dict)  # True (проверка ключа)
print('John' in my_dict)  # False (значение, не ключ)

Характеристики Dictionary:

  • Ключи-значения — каждому ключу соответствует значение
  • Уникальные ключи — каждый ключ только один раз
  • Упорядоченность — с Python 3.7+ порядок сохраняется
  • Изменяемость — можно менять значения
  • Ключи должны быть хешируемы (строки, числа, кортежи)
  • Значения могут быть любыми (список, словарь, set)

Допустимые ключи:

valid_dict = {
    'string_key': 'value',
    42: 'integer key',
    (1, 2): 'tuple key',
    3.14: 'float key',
    True: 'boolean key'
}

# ОШИБКА: список как ключ
my_dict = {[1, 2]: 'value'}  # TypeError: unhashable type

# ОШИБКА: словарь как ключ
my_dict = {{'key': 'value'}: 'data'}  # TypeError

Таблица сравнения

ПараметрSetDictionary
Структура{1, 2, 3}{'key': value}
СодержитТолько значенияКлючи и значения
УникальностьВсе элементы уникальныТолько ключи уникальны
УпорядоченностьНет (неупорядочено)Да (с 3.7+)
Доступ по индексуНетДа, по ключу
Итерацияfor x in setfor key in dict
ПоискO(1)O(1)
ПрименениеУдаление дублейСопоставление данных

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

Пример 1: Удаление дублей (Set)

# Список с дублями
users = ['alice', 'bob', 'alice', 'charlie', 'bob', 'alice']

# Удаляем дубли через Set
unique_users = list(set(users))
print(unique_users)  # ['bob', 'alice', 'charlie']

# Или используем Set напрямую
user_set = set(users)
if 'alice' in user_set:  # Быстро O(1)
    print("Alice есть")

Пример 2: Кэширование пользователей (Dictionary)

# Кэш активных пользователей
user_cache = {
    'alice': {'email': 'alice@example.com', 'status': 'online'},
    'bob': {'email': 'bob@example.com', 'status': 'offline'},
    'charlie': {'email': 'charlie@example.com', 'status': 'online'}
}

# Быстрый доступ по имени
user = user_cache.get('alice')
print(user['status'])  # online

# Обновление
user_cache['alice']['status'] = 'offline'

Пример 3: Сравнение двух списков (Set)

group1 = {'alice', 'bob', 'charlie'}
group2 = {'bob', 'david', 'eve'}

# Пересечение (кто в обеих группах)
common = group1 & group2
print(common)  # {'bob'}

# Объединение
all_users = group1 | group2
print(all_users)  # {'alice', 'bob', 'charlie', 'david', 'eve'}

# Разница
only_in_group1 = group1 - group2
print(only_in_group1)  # {'alice', 'charlie'}

Пример 4: Маршрутизация API (Dictionary)

# Routing table
routes = {
    '/users': 'UserHandler',
    '/products': 'ProductHandler',
    '/orders': 'OrderHandler',
    '/payments': 'PaymentHandler'
}

# Быстрый поиск обработчика
handler_name = routes.get('/users')
if handler_name:
    print(f"Используем {handler_name}")  # Используем UserHandler

Операции Set

set1 = {1, 2, 3, 4, 5}
set2 = {3, 4, 5, 6, 7}

# Объединение (union) — все элементы
result = set1 | set2  # {1, 2, 3, 4, 5, 6, 7}
result = set1.union(set2)

# Пересечение (intersection) — только общие
result = set1 & set2  # {3, 4, 5}
result = set1.intersection(set2)

# Разница (difference) — только в первом
result = set1 - set2  # {1, 2}
result = set1.difference(set2)

# Симметричная разница (symmetric difference)
result = set1 ^ set2  # {1, 2, 6, 7}
result = set1.symmetric_difference(set2)

# Проверка подмножества
small_set = {1, 2}
print(small_set <= set1)  # True (подмножество)

# Проверка надмножества
print(set1 >= small_set)  # True (надмножество)

Операции Dictionary

my_dict = {'a': 1, 'b': 2, 'c': 3}

# Итерация по ключам
for key in my_dict:
    print(key)  # a, b, c

# Итерация по ключам и значениям
for key, value in my_dict.items():
    print(f"{key}: {value}")

# Получение всех ключей
keys = my_dict.keys()  # dict_keys(['a', 'b', 'c'])

# Получение всех значений
values = my_dict.values()  # dict_values([1, 2, 3])

# Получение всех пар
pairs = my_dict.items()  # dict_items([('a', 1), ('b', 2), ('c', 3)])

# Объединение словарей (Python 3.9+)
dict1 = {'a': 1}
dict2 = {'b': 2}
merged = dict1 | dict2  # {'a': 1, 'b': 2}

Когда использовать Set

# 1. Удаление дублей
unique_emails = set(emails_list)

# 2. Проверка принадлежности (быстрая)
if user_id in allowed_users_set:  # O(1)
    grant_access()

# 3. Математические операции
common_interests = user1_interests & user2_interests

# 4. Фильтрация
valid_ids = {1, 2, 3, 4, 5}
filtered = [x for x in data if x in valid_ids]  # O(n)

Когда использовать Dictionary

# 1. Кэширование с доступом по ключу
cache = {user_id: user_data for user_id in users}

# 2. Сопоставление (mapping)
status_codes = {200: 'OK', 404: 'Not Found', 500: 'Server Error'}

# 3. Конфигурация
config = {
    'debug': True,
    'timeout': 30,
    'max_connections': 100
}

# 4. Результаты функции
result = {
    'success': True,
    'data': [...],
    'message': 'Operation completed'
}

Производительность

# Set vs Dictionary для проверки принадлежности
import timeit

my_set = set(range(1000000))
my_dict = {i: None for i in range(1000000)}

# Оба имеют O(1) производительность
set_time = timeit.timeit(lambda: 500000 in my_set, number=1000000)
dict_time = timeit.timeit(lambda: 500000 in my_dict, number=1000000)

print(f"Set: {set_time:.3f}s")  # ~0.05s
print(f"Dict: {dict_time:.3f}s")  # ~0.05s

Вывод

Set — для коллекций уникальных значений и быстрой проверки принадлежности.
Dictionary — для сопоставления ключей и значений.

Является вопрос: нужны ли тебе значения к элементам? Если да → Dictionary. Если нет → Set.

В чём разница между set и dictionary? | PrepBro