История вопроса:
Тип set (множество) был добавлен в Python 2.4 и предоставляет удобный и быстрый способ хранения уникальных неизменяемых элементов с поддержкой теоретико-множественных операций (объединение, пересечение и т.д.). Множества реализованы на базе хеш-таблиц.
Проблема: У многих пользователей нет понимания разницы между set и list, особенностей хранения элементов в set (неупорядоченность, только hashable объекты), а также нюансов использования множеств для оптимизации поиска, проверки уникальности или работы с большими датасетами.
Решение:
Set — изменяемый, неупорядоченный контейнер уникальных hashable объектов. Поддерживает быстрые операции поиска принадлежности, объекдинения, пересечения, разности и симметрической разности. Встроенные методы: add, remove, discard, update, intersection, difference, union, symmetric_difference и другие.
Пример кода:
nums = {1, 3, 5, 7} nums.add(9) nums.update([5, 10]) # 5 уже есть, будет добавлен только 10 other = {3, 9, 11} inter = nums & other # пересечение {3, 9} # Проверка принадлежности — быстрее, чем у list y = 11 if y in nums: print('Есть!')
Ключевые особенности:
in невероятно быстрая (O(1) среднее), в отличие от списка (O(n)).Можно ли добавить список или другой set в set?
Ответ: Нет, нельзя. Только хешируемые (неизменяемые) объекты допустимы: строки, числа, кортежи. Списки и множества — изменяемые, их добавлять нельзя.
Пример кода:
s = set() s.add([1, 2]) # TypeError: unhashable type: 'list' s.add((1, 2)) # OK
Чем отличается метод remove от discard у set?
Ответ: remove(value) возбуждает исключение KeyError, если value не найдено. discard(value) тихо ничего не делает, если такого элемента нет.
Пример кода:
s = {1, 2, 3} s.remove(4) # KeyError s.discard(4) # Нет ошибки
Является ли пустое множество {} set-объектом?
Ответ: Нет. Литерал {} — это всегда пустой dict. Для создания пустого set нужно использовать функцию set().
Пример кода:
empty_set = {} # Это dict empty_set_real = set() # Это set
Негативный кейс
Пытаются хранить уникальные объекты в списке и делать проверку через "in" для поиска дубликатов при больших объёмах данных.
Плюсы:
Минусы:
Позитивный кейс
Используют set для поиска пересечений и уникальных данных в больших массива (например, e-mail рассылки), при этом не возникает дубликатов и операция происходит быстро.
Плюсы:
Минусы: