Множествa или set в python
Множество - неупорядоченная структура данных с уникальными элементами. Как и словари, оформляются фигурными скобками, не имеют индексов.
У множеств (как и у словарей) высокая скорость поиска, гораздо выше, чем у списков.
Множество похоже на словарь, в котором значения отброшены, а оставлены только ключи. Как и в словаре, ключи должны быть уникальными.
Юзай множество, если нужно просто узнать, существует элемент в нем или нет (все остальное неважно).
Создание пустого множества
Не юзай
{}
для создания множества
{}
используются для создания словарей:Всё так, ибо словари в Python появились раньше и взяли себе
{}
.
Преобразование в множество
Добавление элемента с помощью add()
Удаление элемента с помощью remove()
Включение множества (set comprehensions)
Синтаксик:
Пример:
Замороженное множество. frozenset()
Если нужно создать множество, которое нельзя будет изменить - есть функция frozenset()
:
В чем “замороженность”?
Пересечение множеств. Метод .intersection()
или &
Это всё, кстати - уже алгебра.
Найти пересечение одного множества с другим можно так:
Объединение множеств. Метод .union()
или |
Объединить множества можно так:
Разность множеств. Метод .difference()
или -
Разностью двух множеств называется множество, состоящее из тех и только тех элементов, которые входят в первое множество, но не входят во второе.
Исключающее ИЛИ. Функция symmetric_difference()
или оператор ^
Позволяет найти элементы или первого, или второго множества, но не общие:
Подмножество. Функция issubset()
или операторы <=
, <
Позволяет проверить, является ли одно множество подмножеством другого (когда все члены первого множества являются членами второго):
Для того чтобы стать собственным подмножеством, второе множество должно содержать все члены первого и несколько других. Определяется это с помощью оператора <
:
Надмножества. Функция issuperset()
или операторы >=
, >
Надмножество противоположно подмножеству (все члены второго множества являются также членами первого). Для определения этого используется оператор >=
или функция issuperset()
:
Любое множество является надмножеством самого себя:
Можно проверить правильное надмножество (первое множество содержит все члены второго и несколько других) с помощью оператора >
:
Множество не может быть правильным надмножеством самого себя:
Другие методы множеств и операции с множествами
Методы множеств
Метод | Что делает метод |
---|---|
nums.add(elem) | добавляет элемент в множество |
nums.remove(elem) | удаляет элемент из множества. KeyError, если такого элемента не существует |
nums.discard(elem) | удаляет элемент, если он находится в множестве. Если элемента нет, то ничего не происходит |
nums.pop() | удаляет первый элемент из множества. Так как множества не упорядочены, нельзя точно сказать, какой элемент будет первым |
nums.clear() | очистка множества |
Операции со множествами
Операция | Метод | Что делает операция |
---|---|---|
A | B | A.union(B) | Возвращает множество, являющееся объединением множеств A и B |
A |= B | A.update(B) | Добавляет в множество A все элементы из множества B |
A & B | A.intersection(B) | Возвращает множество, являющееся пересечением множеств A и B |
A &= B | A.intersection_update(B) | Оставляет в множестве A только те элементы, которые есть в множестве B |
A - B | A.difference(B) | Возвращает разность множеств A и B (элементы, входящие в A, но не входящие в B) |
A -= B | A.difference_update(B) | Удаляет из множества A все элементы, входящие в B |
Проверка наличия значения с помощью оператора in
Это самый распространенный сценарий использования множеств:
Если нужно проверить наличие сразу нескольких значений множества: допустим, нужен напиток с апельсиновым соком или вермутом. Для юзай оператор пересечения множеств &
:
Результатом работы оператора &
является множество со всеми элементами из обоих сравниваемых списков. Если ни один из заданных ингредиентов не содержится в предлагаемых коктейлях, оператор &
вернет пустое множество. Этот результат можно считать равным False
.
Или если нужна водка, не смешанная со сливками или вермутом:
fck alcohol
Алгоритмическая сложность методов множества
Добавление элемента в множество add
- средний случай: $O(1)$
- худший случай: $O(n)$, где $n$ - размер множества
Худший случай происходит, когда случается коллизия хешей и требуется перехеширование и перестроение множества.
Поиск элемента в множестве in
- средний случай: $O(1)$
- худший случай: $O(n)$, где $n$ - размер множества
В худшем случае поиск может пройти через все элементы множества.
Удаление элемента из множества remove
, discard
- средний случай: $O(1)$
- худший случай: $O(n)$
В худшем случае удаление может потребовать перестроения множества после завершения процесса.
Объединение множеств union
- средний случай: $O(min(len(set1), len(set2)))$
$set1$ и $set2$ - размеры двух объединяемых множеств - худший случай: $O(len(set1) + len(set2))$
Пересечение множеств intersection
- средний случай: $O(min(len(set1), len(set2)))$
- худший случай: $O(min(len(set1), len(set2)))$
Соус: Книга “Простой Python” ⇒ Глава 8. “Словари и множества”