Гид по технологиям

Множества в Python — создание и операции

4 min read Python Обновлено 03 Dec 2025
Множества в Python — создание и операции
Множества в Python — создание и операции

Рука, держащая учебник по Python

Множество (set) — коллекция уникальных элементов. Каждый элемент должен быть хешируемым (например, числа, строки, кортежи). Множества не имеют порядковых индексов и не гарантируют порядок элементов.

Краткое определение

  • Что такое множества: набор уникальных, хешируемых значений.
  • Характер: изменяемое (можно добавлять/удалять элементы), но сами элементы должны быть неизменяемыми (хешируемыми).
  • Когда использовать: удаление дублей, быстрые проверки наличия, математические операции над наборами.

Основные свойства множеств

  • Множества не допускают дублей: при добавлении одинаковых значений сохраняется только одно.
  • Порядок не определяется: при выводе вы не получите элементы в том же порядке, в котором добавляли.
  • Элементы должны быть хешируемыми: список или словарь как элемент вызовет TypeError.
  • Множество само по себе изменяемо: можно добавлять, удалять элементы и объединять множества.

Важно: пустой литерал {} создаёт пустой словарь, а не множество. Для пустого множества используйте set().

Как создать множество

Литерал с фигурными скобками и запятыми:

my_set = {1, 2, "MUO", "Google"}
print(my_set)
# Пример вывода: {1, 2, 'Google', 'MUO'}

Пустое множество:

empty = set()
print(type(empty))
# 

Преобразование из других коллекций (полезно для удаления дублей):

my_list = [1, 2, 2, "MUO", "Google", "Google"]
my_set = set(my_list)
print(my_set)
# Вывод: {1, 2, 'MUO', 'Google'}

При преобразовании словаря set(dict) вернёт множество ключей словаря:

my_dict = {"Mango": 2, "Orange": 2, "carrot": 2, "MUO": "tech", "Google": "search"}
unique_keys = set(my_dict)
print(unique_keys)
# Вывод: {'Google', 'Mango', 'MUO', 'Orange', 'carrot'}

Частые операции над множествами

Добавление и удаление элементов:

s = {1, 3, 5}
s.add(7)        # добавляет элемент
s.discard(3)    # удаляет элемент, не бросая исключение если отсутствует
s.remove(5)     # удаляет элемент, бросает KeyError если нет
print(s)
# Например: {1, 7}

Добавление нескольких элементов:

s.update([2, 4])
# s теперь содержит 1,2,4,7 (порядок не гарантирован)

Удаление и извлечение произвольного элемента:

val = s.pop()   # удаляет и возвращает произвольный элемент
s.clear()       # очищает множество

Проверки отношений множеств:

A = {1, 2, 3}
B = {2, 3}
print(B.issubset(A))    # True
print(A.issuperset(B))  # True
print(A.isdisjoint({4,5}))  # True если пересечения нет

Математические операции (два варианта: методы и операторы):

setA = {1, 3, 5}
setB = {1, 4, 6}
# Объединение
print(setA.union(setB))  # {1,3,4,5,6}
print(setA | setB)       # {1,3,4,5,6}
# Пересечение
print(setA.intersection(setB))  # {1}
print(setA & setB)              # {1}
# Разность
print(setA.difference(setB))  # {3,5}
print(setA - setB)            # {3,5}
# Симметрическая разность
print(setA.symmetric_difference(setB))  # {3,4,5,6}
print(setA ^ setB)                      # {3,4,5,6}

Частые ошибки и когда множества не подходят

  • Нужен порядок: если важен порядок элементов, множества не подходят. Используйте список или dict (в Python 3.7+ словарь сохраняет порядок вставки).
  • Нужна изменяемая структура внутри элементов: элементы множества должны быть хешируемыми, поэтому list или dict нельзя поместить в set.
  • Повторяющиеся элементы при сохранении порядка: чтобы удалить дубликаты и сохранить порядок, используйте dict.fromkeys() или вспомогательный цикл.

Пример сохранения порядка при удалении дублей:

items = [3, 1, 2, 3, 2]
unique_in_order = list(dict.fromkeys(items))
print(unique_in_order)  # [3,1,2]

Альтернативные подходы

  • dict.fromkeys(iterable) — быстро удаляет дубликаты и сохраняет порядок (Python 3.7+).
  • collections.OrderedDict — для старых версий Python, где важен порядок.
  • pandas.Series.unique / numpy.unique — для работы с большими числовыми наборами или таблицами.

Ментальные модели и эвристики

  • Множество = корзина уникальных, хешируемых предметов.
  • Операции над множествами соответствуют классическим математическим операциям (объединение, пересечение, разность).
  • Проверка вхождения (x in s) обычно O(1) в среднем, поэтому множества хороши для быстрых проверок.

Шпаргалка (cheat sheet)

ДействиеМетодОператор

| Объединение | setA.union(setB) | setA | setB | | Пересечение | setA.intersection(setB) | setA & setB | | Разность | setA.difference(setB) | setA - setB | | Симметрическая разность | setA.symmetric_difference(setB) | setA ^ setB | | Добавить | set.add(x) | — | | Обновить | set.update(iterable) | — | | Удалить безопасно | set.discard(x) | — | | Удалить с ошибкой | set.remove(x) | — | | Очистить | set.clear() | — | | Извлечь | set.pop() | — |

Ролевые чек-листы

  • Для разработчика:

    • Используйте set для удаления дублей и ускорения проверок.
    • Проверяйте хешируемость элементов.
    • Не используйте {} для пустого множества.
  • Для аналитика данных:

    • Для уникальных ключей используйте set или pandas.unique в зависимости от формата данных.
    • Для сохранения порядка применяйте dict.fromkeys.
  • Для тестировщика:

    • Тестируйте поведение при попытке добавить не-хешируемый объект.
    • Тестируйте граничные случаи: пустое множество, одно и то же значение несколько раз.

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

  • Функция remove_duplicates(items) должна возвращать коллекцию с уникальными элементами.
    • Вход: [1,1,2] -> Выход: {1,2} или [1,2] (если требуется порядок — список через dict.fromkeys).
  • Проверить добавление не-хешируемого элемента: ожидаем TypeError.
  • Проверить поведение пустого множества: set() создаётся корректно.

Примеры практического применения

  • Быстрая проверка уникальности: if len(set(items)) != len(items): …
  • Проверка пересечения пользователей в двух списках: if set(users_a) & set(users_b): …
  • Фильтрация дубликатов в потоках данных до помещения в БД.

Советы безопасности и производительности

  • Операции с множествами обычно работают очень быстро благодаря хешированию; однако хеширование само по себе может быть дорого для сложных типов (например, больших кортежей).
  • Следите за тем, чтобы элементы были действительно хешируемыми и несли ожидаемую семантику равенства (hash и eq).

Часто задаваемые вопросы

Как создать пустое множество?

Пустое множество создают вызовом set(), не {} — это создаст словарь.

Можно ли хранить списки в множестве?

Нет, списки не хешируемы. Для хранения составных структур используйте кортежи или представления, которые хешируемы.

Сохраняет ли set порядок элементов?

Нет, множества не сохраняют порядок. Для сохранения порядка применяйте dict.fromkeys() или списки.

Короткое резюме

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

Важно: если нужен упорядоченный набор уникальных элементов, используйте dict.fromkeys() или коллекции, сохраняющие порядок.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Очистка кэша Dropbox на Android и iPhone
Мобильные устройства

Очистка кэша Dropbox на Android и iPhone

Как разблокировать адрес в Gmail — пошагово
Gmail

Как разблокировать адрес в Gmail — пошагово

Отключить AMBER-оповещения на iPhone и Android
Мобильные устройства

Отключить AMBER-оповещения на iPhone и Android

Проверить место в Google Аккаунте
Google

Проверить место в Google Аккаунте

Изменить пароль Gmail на iPhone
Гайды

Изменить пароль Gmail на iPhone

Assistant.to — планирование встреч в Gmail
Продуктивность

Assistant.to — планирование встреч в Gmail