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

Для чего использовал множество?

1.2 Junior🔥 131 комментариев
#Python Core

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

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

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

Использование множеств (Sets) в Python

Множества — мощный инструмент в Python для решения задач, где нужна уникальность элементов и операции над множествами.

Основные случаи использования

1. Удаление дубликатов

Это самый частый case. Например, мне нужно получить уникальные ID пользователей из логов:

user_ids = [1, 2, 2, 3, 3, 3, 4, 5, 5]
unique_ids = set(user_ids)
# {1, 2, 3, 4, 5}

# Очень быстро — O(1) на добавление

2. Проверка наличия элемента

Операция in для set — O(1), для list — O(n). Это критично для больших данных:

# ❌ Медленно для списка
valid_statuses = ["active", "pending", "archived", "deleted"]
if status in valid_statuses:  # O(n)
    process()

# ✅ Быстро для множества
valid_statuses = {"active", "pending", "archived", "deleted"}
if status in valid_statuses:  # O(1)
    process()

В одном проекте это дало 5x ускорение на проверке 10M записей.

3. Операции над множествами

Применял для фильтрации и анализа данных:

# Какие теги есть в первом посте, но не во втором
tags_post1 = {"python", "django", "backend"}
tags_post2 = {"python", "javascript", "web"}

only_in_first = tags_post1 - tags_post2  # {"django", "backend"}
common_tags = tags_post1 & tags_post2     # {"python"}
all_tags = tags_post1 | tags_post2        # {"python", "django", "backend", ...}

Реальные примеры из моей практики

Анализ permission-based access

class UserPermissions:
    def __init__(self, permissions: set[str]):
        self.permissions = permissions
    
    def has_all(self, required: set[str]) -> bool:
        """Есть ли все требуемые permissions"""
        return required.issubset(self.permissions)
    
    def has_any(self, required: set[str]) -> bool:
        """Есть ли хотя бы одно из required"""
        return bool(self.permissions & required)

user = UserPermissions({"read", "write", "delete"})
user.has_all({"read", "write"})  # True
user.has_any({"admin", "read"})   # True

Синхронизация кэша

Когда нужно обновить кэш с новыми данными и удалить старые:

def sync_cache(old_ids: set, new_ids: set, cache: dict):
    # Удалить из кэша старые ID
    to_delete = old_ids - new_ids
    for id in to_delete:
        cache.pop(id, None)
    
    # Загрузить новые
    to_add = new_ids - old_ids
    for id in to_add:
        cache[id] = fetch_data(id)
    
    return cache

Дедупликация логов

В системе было множество повторяющихся ошибок. Использовал set для быстрого поиска уникальных:

def find_unique_errors(error_log: list[str]) -> set[str]:
    return set(error_log)

errors = [
    "Connection timeout",
    "Connection timeout",
    "DB error",
    "Connection timeout",
]

unique = find_unique_errors(errors)  # 2 уникальных ошибки

Когда я выбираю Set вместо List

ЗадачаListSet
Проверка наличияO(n)O(1)
Удаление дубликатовРучноеАвтоматическое
Сохранение порядкаДаНет
Позиционный доступlist[0]
Множественные операцииДа (union, intersection)

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

В одном проекте я переделал валидацию 50K статусов с list на set:

import timeit

# Список
statuses_list = ["status_1", "status_2"] * 1000
time_list = timeit.timeit(
    lambda: "status_500" in statuses_list, 
    number=100000
)  # ~0.5 сек

# Множество
statuses_set = set(statuses_list)
time_set = timeit.timeit(
    lambda: "status_500" in statuses_set, 
    number=100000
)  # ~0.01 сек

# 50x ускорение!

Осторожность

Не все типы можно добавить в set — только hashable (неизменяемые):

# ✅ Работает
set([1, 2, 3])  # int hashable
set(["a", "b"])  # str hashable
set([(1, 2)])  # tuple hashable

# ❌ Ошибка
set([[1, 2]])  # TypeError: unhashable type: list
set([{"key": "value"}])  # TypeError: unhashable type: dict

Если нужно множество из dict или list, использую frozenset или находчивость:

# Множество ID объектов (если нужны их атрибуты)
ids = {obj.id for obj in objects}  # set comprehension

Множества — основной инструмент для оптимизации, когда есть операции поиска и фильтрации данных.

Для чего использовал множество? | PrepBro