← Назад к вопросам
Что такое множество (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
| Операция | Set | List | Dict |
|---|---|---|---|
| Создание | {1,2,3} | [1,2,3] | {'a':1} |
| Поиск in | O(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 s | O(1) |
| Union | s1 | s2 | O(n+m) |
| Intersection | s1 & s2 | O(min(n,m)) |
| Difference | s1 - s2 | O(n) |
| Размер | len(s) | O(1) |
Ключевая идея: Set — это оптимальный выбор когда нужны уникальные элементы и быстрые операции поиска.