Что такое множество (Set) в Python и каковы его основные свойства?

«Что такое множество (Set) в Python и каковы его основные свойства?» — вопрос из категории Python, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Множество (Set) в Python — это встроенная изменяемая коллекция уникальных и хешируемых объектов, не имеющая порядка (неиндексируемая). Реализована на основе хеш-таблицы, что обеспечивает очень быструю (в среднем O(1)) проверку вхождения элемента (in).

Ключевые свойства и операции:

  • Создание:

    my_set = {1, 2, 3}           # Использование фигурных скобок
    empty_set = set()            # Пустое множество. {} — создаст словарь!
    from_list = set([1, 2, 2, 3]) # {1, 2, 3} — дубликаты удаляются
  • Основные операции (модифицируют исходное множество):

    s = {1, 2, 3}
    s.add(4)          # {1, 2, 3, 4}
    s.remove(2)       # {1, 3, 4}. KeyError, если элемента нет
    s.discard(10)     # {1, 3, 4}. Удаляет, если есть (без ошибки)
    popped = s.pop()  # Удаляет и возвращает случайный элемент (т.к. порядка нет)
    s.clear()         # set()
  • Теоретико-множественные операции:

    a = {1, 2, 3, 4}
    b = {3, 4, 5, 6}
    
    union = a | b           # {1, 2, 3, 4, 5, 6} (объединение)
    intersection = a & b     # {3, 4} (пересечение)
    difference = a - b       # {1, 2} (разность: элементы в a, но не в b)
    sym_diff = a ^ b         # {1, 2, 5, 6} (симметрическая разность)
    
    # Есть также методы, не создающие новый объект:
    a.update(b)             # a |= b. Добавляет в 'a' все элементы из 'b'
    a.intersection_update(b)# a &= b. Оставляет в 'a' только общие элементы
  • Проверки:

    a = {1, 2}
    b = {1, 2, 3}
    print(a <= b)           # True. a является подмножеством b (issubset)
    print(b >= a)           # True. b является надмножеством a (issuperset)
    print(a.isdisjoint({5, 6})) # True. Множества не пересекаются

Типичные сценарии использования:

  1. Удаление дубликатов из списка: unique_list = list(set(duplicate_list)) (порядок может быть потерян).
  2. Проверка членства: Гораздо быстрее, чем element in list, особенно для больших коллекций.
  3. Нахождение общих/уникальных элементов: Например, общие теги у двух статей (tags1 & tags2).
  4. Моделирование математических множеств.

Важное ограничение: Элементами множества могут быть только хешируемые (неизменяемые) типы: числа, строки, кортежи (из хешируемых элементов). Списки, словари и другие множества — нельзя.