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

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

1.0 Junior🔥 131 комментариев
#Python и программирование

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

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

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

Set (Множество) в Python: полный гайд

Что такое Set

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

Основные характеристики

  • Уникальные элементы — нет дубликатов
  • Неупорядочено — нет индексов
  • Изменяемо (mutable) — можно добавлять/удалять
  • Хешируемые элементы — только immutable типы
  • Быстрые операции — O(1) для поиска

Синтаксис

Создание Set'а

# Способ 1: литерал
colors = {'red', 'green', 'blue'}
print(colors)  # {'red', 'green', 'blue'} (порядок может отличаться)

# Способ 2: конструктор set()
from_list = set([1, 2, 2, 3, 3, 3])
print(from_list)  # {1, 2, 3} (дубликаты удалены)

# Способ 3: пустой set (важно!)
empty_set = set()  # {} это пустой dict, а не set
print(type(empty_set))  # <class 'set'>

# Способ 4: из строки
letters = set('hello')
print(letters)  # {'h', 'e', 'l', 'o'} (l появляется один раз)

Основные операции

1. Добавление и удаление

s = {1, 2, 3}

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

# Добавить элемент, который уже есть (ничего не произойдет)
s.add(2)  # ничего не меняется

# Удалить элемент
s.remove(3)  # выдаст ошибку если элемента нет
print(s)  # {1, 2, 4}

# Удалить безопасно
s.discard(10)  # не выдаст ошибку если элемента нет

# Удалить и получить случайный элемент
last = s.pop()  # удалит случайный
print(last)  # например, 1

2. Проверка принадлежности

s = {'apple', 'banana', 'cherry'}

# Проверка in/not in (O(1) - очень быстро)
print('apple' in s)  # True
print('mango' in s)  # False
print('mango' not in s)  # True

# VS List (медленнее)
my_list = ['apple', 'banana', 'cherry']
print('apple' in my_list)  # True (но медленнее, O(n))

3. Размер

s = {1, 2, 3, 4, 5}
print(len(s))  # 5
print(bool(s))  # True (не пустой)
print(bool(set()))  # False (пустой)

Теоретико-множественные операции

Union (объединение) — все элементы из обоих

s1 = {1, 2, 3}
s2 = {3, 4, 5}

# Способ 1: метод union()
result = s1.union(s2)  # {1, 2, 3, 4, 5}

# Способ 2: оператор |
result = s1 | s2  # {1, 2, 3, 4, 5}

# Способ 3: с несколькими
result = s1 | s2 | {5, 6, 7}  # {1, 2, 3, 4, 5, 6, 7}

Intersection (пересечение) — элементы в обоих

s1 = {1, 2, 3, 4}
s2 = {3, 4, 5, 6}

# Способ 1: метод intersection()
result = s1.intersection(s2)  # {3, 4}

# Способ 2: оператор &
result = s1 & s2  # {3, 4}

Difference (разность) — элементы только в первом

s1 = {1, 2, 3, 4}
s2 = {3, 4, 5, 6}

# Способ 1: метод difference()
result = s1.difference(s2)  # {1, 2}

# Способ 2: оператор -
result = s1 - s2  # {1, 2}

Symmetric Difference (симметрическая разность) — элементы в одном, но не в обоих

s1 = {1, 2, 3, 4}
s2 = {3, 4, 5, 6}

# Способ 1: метод symmetric_difference()
result = s1.symmetric_difference(s2)  # {1, 2, 5, 6}

# Способ 2: оператор ^
result = s1 ^ s2  # {1, 2, 5, 6}

Подмножество и надмножество

s1 = {1, 2}
s2 = {1, 2, 3, 4}
s3 = {1, 2}

# Подмножество ⊆
print(s1 <= s2)  # True (s1 подмножество s2)
print(s1.issubset(s2))  # True

# Надмножество ⊇
print(s2 >= s1)  # True (s2 надмножество s1)
print(s2.issuperset(s1))  # True

# Равенство
print(s1 == s3)  # True (содержат одни элементы)

# Не пересекаются (disjoint)
print(s1.isdisjoint({5, 6}))  # True (нет общих элементов)

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

Пример 1: Найти уникальные значения

import pandas as pd

data = [1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 4]

# Способ 1: Set
unique_set = set(data)
print(len(unique_set))  # 4 (уникальных значений)
print(unique_set)  # {1, 2, 3, 4}

# Способ 2: Set vs List (производительность)
import time
big_list = list(range(1000)) * 100  # 100k элементов

start = time.time()
for val in big_list:
    if val == 500:  # поиск в list - медленно O(n)
        break
print(f"List search: {time.time() - start:.6f}s")

start = time.time()
for val in set(big_list):
    if val == 500:  # поиск в set - быстро O(1)
        break
print(f"Set search: {time.time() - start:.6f}s")
# Set намного быстрее

Пример 2: Найти дубликаты

data = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]

# Способ 1: Set для поиска
seen = set()
duplicates = []
for item in data:
    if item in seen:  # O(1) - быстро
        duplicates.append(item)
    seen.add(item)

print(duplicates)  # [2, 3, 4]

# Способ 2: Использовать Counter
from collections import Counter
duplicates = [item for item, count in Counter(data).items() if count > 1]
print(duplicates)  # [2, 3, 3, 4] (с повторениями)

Пример 3: Найти общих пользователей

# Какие пользователи делали покупку И просматривали товар
purchase_users = {101, 102, 103, 104, 105}
browse_users = {103, 104, 105, 106, 107}

# Пересечение
common = purchase_users & browse_users
print(common)  # {103, 104, 105} (делали И просматривали)

# Только покупали (но не просматривали?)
only_purchase = purchase_users - browse_users
print(only_purchase)  # {101, 102}

# Только просматривали (но не покупали)
only_browse = browse_users - purchase_users
print(only_browse)  # {106, 107}

Пример 4: Анализ когорт

# Какие города представлены в разных месяцах
jan_cities = {'NY', 'LA', 'Chicago', 'Houston'}
feb_cities = {'LA', 'Chicago', 'Houston', 'Phoenix'}
mar_cities = {'Chicago', 'Houston', 'Phoenix', 'Austin'}

# Города во все 3 месяца
all_months = jan_cities & feb_cities & mar_cities
print(all_months)  # {'Chicago', 'Houston'}

# Все города за период
all_cities = jan_cities | feb_cities | mar_cities
print(all_cities)  # {'NY', 'LA', 'Chicago', 'Houston', 'Phoenix', 'Austin'}

# Города только в январе
only_jan = jan_cities - feb_cities - mar_cities
print(only_jan)  # {'NY'}

Пример 5: Валидация данных

# Проверить что данные содержат только нужные категории
valid_categories = {'A', 'B', 'C'}
data_categories = {'A', 'B', 'C', 'D', 'E'}  # 'D', 'E' невалидные

invalid = data_categories - valid_categories
if invalid:
    print(f"Невалидные категории: {invalid}")
else:
    print("Все данные валидны")

Set vs List vs Dict

ОперацияSetListDict
Создание{1,2,3}[1,2,3]{'a':1}
Поиск inO(1) ✅O(n) ❌O(1) ✅
ДобавлениеO(1)O(1)O(1)
УдалениеO(1)O(n)O(1)
ПорядокНетДаДа (3.7+)
УникальностьДаНетКлючи уникальны
ИндексацияНетДаПо ключам

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

Используй Set если:

  • Нужны только уникальные значения
  • Часто проверяешь in / not in
  • Нужны операции пересечения, объединения
  • Нужна скорость (O(1) операции)

НЕ используй Set если:

  • Нужна упорядоченность (используй list или tuple)
  • Нужны индексы (используй list)
  • Нужны пары ключ-значение (используй dict)

frozenset — неизменяемый Set

# frozenset нельзя менять
immutable = frozenset([1, 2, 3])
print(immutable)  # frozenset({1, 2, 3})

# Попытка добавить ошибка
immutable.add(4)  # AttributeError

# Но можно использовать как ключ в dict
dct = {immutable: 'value'}  # OK, так как frozenset хешируемый
dct2 = {{1, 2}: 'value'}  # Ошибка, set не хешируемый

Памятка для собеседования

ОперацияСинтаксисСложность
Созданиеset([1,2,3])O(n)
Добавлениеs.add(x)O(1)
Удалениеs.remove(x)O(1)
Поискx in sO(1)
Unions1 | s2O(n+m)
Intersections1 & s2O(min(n,m))
Differences1 - s2O(n)
Размерlen(s)O(1)

Ключевая идея: Set — это оптимальный выбор когда нужны уникальные элементы и быстрые операции поиска.