Как создать и использовать множества (set) в Python
Коротко о множестве: что это и когда применять
Множество — это неупорядоченная коллекция уникальных значений. Используйте set, когда вам нужно:
- удалить дубликаты из последовательности;
- быстро проверять принадлежность элемента (операции membership);
- выполнять операции над наборами элементов (union, intersection и т. д.).
Важное замечание: множество само по себе изменяемо — вы можете добавлять и удалять элементы. Однако элементы множества должны быть хэшируемыми (immutable в смысле хэшируемости): числа, строки, кортежи и т.п. Нельзя поместить список или словарь как элемент множества.
Особенности множеств
- Уникальность: дубликаты автоматически удаляются.
- Неупорядоченность: у множеств нет индексов, порядок элементов не гарантирован.
- Изменяемость структуры: методы add/remove/update позволяют менять состав множества.
- Элементы должны быть хэшируемыми (hashable).
Факт-бокс:
- Проверка принадлежности и добавление/удаление элементов в среднем выполняются за амортизированное O(1).
- Операции объединения/пересечения/разности обычно выполняются за O(n + m), где n и m — размеры множеств.
Создание множества
Вы можете создать множество с помощью литерала в фигурных скобках или функции set().
# литерал
my_set = {1, 2, "MUO", "Google"}
print(my_set)
# возможный вывод: {1, 2, 'MUO', 'Google'}
# из списка
my_list = [1, 2, "MUO", "Google"]
my_set = set(my_list)
print(my_set)
# вывод: {1, 2, 'MUO', 'Google'}
# тип
print(type(my_set))
# вывод: Удаление дубликатов из последовательности
Преобразование списка в множество — простой способ убрать дубликаты. Учтите, что при этом порядок элементов теряется.
my_list = [1, 2, 2, "MUO", "MUO", "Google", "Google"]
my_set = set(my_list)
print(my_set)
# вывод: {1, 2, 'MUO', 'Google'}
print(len(my_set))
# вывод: 4Если требуется сохранить исходный порядок при удалении дубликатов, используйте dict.fromkeys() или сохранение встреченных элементов в отдельном списке (см. раздел с альтернативами).
Преобразование словаря в множество ключей
При преобразовании словаря в set вы получите множество ключей (duplicates в литерале словаря перезаписываются в момент создания словаря — остается последний ключ с его значением):
my_dict = {
"Mango": 2,
"Orange": 2,
"carrot": 2,
"MUO": "web",
"Google": "engine"
}
unique_keys = set(my_dict)
print("Уникальные ключи: {}".format(unique_keys))
# вывод: Уникальные ключи: {'Google', 'Mango', 'MUO', 'Orange', 'carrot'}
# итерация по множеству
for key in unique_keys:
print(key)Основные операции над множествами
Примеры с пояснениями и альтернативными синтаксисами.
Объединение (union): возвращает все элементы из обоих множеств.
setA = {1, 3, 5}
setB = {1, 4, 6}
newSet = setA.union(setB)
print(newSet)
# вывод: {1, 3, 4, 5, 6}
# альтернативный синтаксис
newSet2 = setA | setB
print(newSet2)Разность (difference): элементы, которые есть в A, но нет в B.
setA = {1, 3, 5}
setB = {2, 4, 5}
print(setA.difference(setB))
# вывод: {1, 3}
# альтернативно: setA - setBСимметрическая разность: элементы, присутствующие в одном из множеств, но не в обоих.
setA = {1, 3, 5}
setB = {2, 4, 5}
print(setA ^ setB)
# вывод: {1, 2, 3, 4}
# или
print(setA.symmetric_difference(setB))Пересечение (intersection): общие элементы всех переданных множеств.
setA = {1, 3, 5}
setB = {1, 4, 6}
setC = {1, 5, 4}
newSet = setA.intersection(setB, setC)
print(newSet)
# вывод: {1}Добавление и обновление:
setA = {1, 3, 5}
setA.add(7) # добавляет одиночный элемент
print(setA)
# вывод: {1, 3, 5, 7}
# add принимает один аргумент; если нужно добавить несколько элементов, используйте update()
setA.update([8, 9]) # добавляет несколько элементов
print(setA)
# вывод: {1, 3, 5, 7, 8, 9}Удаление элементов:
setA = {1, 3, 5}
setA.remove(5) # KeyError, если элемента нет
print(setA)
# вывод: {1, 3}
setA.discard(10) # безопасно, не бросит исключение
val = setA.pop() # удаляет и возвращает произвольный элемент
print(val)
setA.clear() # очищает множество
print(setA)
# вывод: set()Проверки отношений между множествами:
setA = {1, 3, 5}
setB = {1, 4, 6}
print(setA.isdisjoint(setB)) # True, если пересечений нет
print(setA.issubset(setB)) # True, если setA полностью содержится в setB
print(setA.issuperset({1,3})) # True, если setA содержит указанные элементыЧастые ошибки и случаи, когда множества не подходят
- Нужен порядок или индексация: множества не предоставляют порядок и не поддерживают индексирование.
- Нужны повторяющиеся элементы (multiset/multi-set): используйте collections.Counter.
- Элементы не хэшируемы (списки, словари): их нельзя добавлять в set.
Пример неудачного варианта:
# Нельзя так — список не может быть элементом множества
s = set()
# s.add([1,2]) # TypeError: unhashable type: 'list'Альтернативы и приемы (когда set не подходит)
- Сохранить порядок при удалении дубликатов: list(dict.fromkeys(seq)) или сохранять встреченные элементы в списке/множине.
- Мультисеты (счётчики): collections.Counter для подсчёта повторов.
- Упорядоченное множество: в стандартной библиотеке нет OrderedSet; можно использовать dict.keys() (в Python 3.7+ порядок вставки сохраняется) или сторонние реализации.
Пример удаления дубликатов с сохранением порядка:
def unique_preserve_order(seq):
seen = set()
result = []
for item in seq:
if item not in seen:
seen.add(item)
result.append(item)
return result
print(unique_preserve_order([3,1,2,3,2,1]))
# вывод: [3, 1, 2]Чит‑шит: быстрые команды
- Создать: my_set = {1,2} или set(iterable)
- Проверка принадлежности: x in my_set
- Добавить: my_set.add(x)
- Удалить безопасно: my_set.discard(x)
- Объединение: a | b или a.union(b)
- Пересечение: a & b или a.intersection(b)
- Разность: a - b или a.difference(b)
- Симметрическая разность: a ^ b или a.symmetric_difference(b)
Ролевые чеклисты (кто и когда использует)
Разработчик:
- Использовать set для быстрых проверок membership.
- Не полагаться на порядок в set.
- Использовать update() для добавления множества элементов.
Аналитик/Data Scientist:
- Убирать дубликаты перед агрегацией (если порядок не важен).
- Если нужен подсчёт — применять Counter, а не set.
- Для уникальных ключей словаря конвертировать dict.keys() в set.
Ментальные модели и эвристики
- Множество — это математическое множество: уникальные элементы без порядка.
- Для частых membership‑проверок выбирайте set, для последовательной обработки с дубликатами — list.
- Если нужно сохранить порядок и убрать дубликаты — используйте dict.fromkeys() или вспомогательный set для отсечения уже встреченных.
Примеры сложных сценариев и обходные пути
Нужен набор кортежей, один из элементов — изменяемая структура: храните её в неизменяемом виде (например, сериализуйте или используйте tuple вместо list).
Нужно атомарно объединять большие множества в многопоточном окружении: рассмотрите блокировки или работу с потокобезопасными структурами/очередями.
Хранить данные с частыми вставками и удалениями и дополнительно сохранять порядок: комбинируйте deque/list и set (set для проверки, deque/list для порядка).
Краткое резюме
- set в Python — удобный инструмент для удаления дубликатов и выполнения операций над наборами.
- Множества изменяемы, но элементы должны быть хэшируемыми.
- Для задач, где важен порядок или нужен подсчёт, лучше использовать альтернативы (dict.fromkeys, Counter и т.д.).
Примечание: пробуйте простые примеры в интерактивной консоли (REPL) — это самый быстрый способ понять поведение операций с множествами.
Словарь терминов (коротко)
- set: коллекция уникальных элементов без порядка.
- hashable/хэшируемый: объект, у которого есть неизменяемое значение хэша; такой объект можно использовать как элемент множества или ключ словаря.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone