Множества в Python
Множество (set) представляют собой неупорядоченную коллекцию уникальных (неповторяющихся) элементов. Множество могут содержать только не изменяемые объекты. Хотя множества относятся к итерируемым объектам, они не относятся к последовательностям и не поддерживают индексирование и сегментацию.
1.1. Создание множества на Python
Создание множества (set) происходит с помощью фигурных скобок {} так же, как и словарей, но элементы разделены просто запятыми, без пар "ключ : значение". В отличие от словарей и списков, множества не хранятся в каком-либо определенном порядке.
>>> colors = {'blue', 'red', 'yellow', 'red', 'green'}
>>> print(colors)
{'red', 'green', 'yellow', 'blue'}
Повторяющаяся строка 'red' была удалена при выводе. Одно из самых важных областей применения множеств - это удаление дубликатов, которое выполняется автоматически. Значения выводятся не в порядке их перечисления, множества неупорядочены.
1.2. Создание множеств встроенной функцией set
Множества можно создавать на базе других коллекций, используя встроенную функцию set(). В примере ниже создается множество на базе списка.
>>> cars = ['bmw', 'audi', 'mersedes', 'bmw', 'ford']
>>> set(cars)
{'bmw', 'ford', 'audi', 'mersedes'}
Если вам нужно создать пустое множество, то нужно использовать функцию set() с пустыми круглыми скобками, вместо фигурных.
set()
1.3. Определение длины множества
Количество элементов определяется при помощи встроенной функции len.
>>> cars = {'bmw', 'audi', 'mersedes', 'ford'}
>>> len(cars)
4
2.1. Проверка наличия элемента в множестве
Для проверки содержания элемента в множестве можно воспользоваться операторами in или not in.
>>> cars = {'bmw', 'audi', 'mersedes', 'ford'}
>>> 'audi' in cars
True
>>> 'audi' not in cars
False
2.2. Перебор элементов множества
Для перебора элементов можно воспользоваться циклом for.
>>> cars = {'bmw', 'audi', 'mersedes', 'ford'}
>>> for car in cars:
... print(car)
...
bmw
ford
audi
mersedes
Так как множества не упорядочены, порядок перебора не имеет значения.
3.1. Сравнение множеств.
Для сравнения множеств в Python можно использовать различные операторы и методы:
- Проверка равенства и не равенства:
>>> {1, 5, 10} == {5, 10, 1}
True
>>> {1, 5, 10} != {5, 10, 1}
False
- Оператор < проверяет что все элементы левого операнда, присутствуют в правом и множества не равны:
>>> {1, 5, 10} < {5, 10, 1}
False
>>> {1, 5, 10} < {5, 10, 1, 4}
True
- Оператор <= проверяет что все элементы левого операнда, присутствуют в правом и множества могут быть равны. Так же для проверки можно воспользоваться методом issubset:
>>> {1, 5, 10} <= {5, 10, 1}
True
>>> {1, 5} <= {5, 10, 1}
True
>>> {1, 5, 10}.issubset({5, 10, 1})
True
>>> {1, 5}.issubset({5, 10, 1})
True
- Оператор > проверяет что все элементы правого операнда присутствуют в левом и левый операнд содержит больше элементов:
>>> {1, 5, 10} > {5, 10, 1}
False
>>> {1, 5, 10, 8} > {5, 10, 1}
True
- Оператор >= проверяет что все элементы правого операнда присутствуют в левом и эти множества могут быть равны. Так же для проверки можно воспользоваться методом issuperset:
>>> {1, 5, 10} >= {5, 10, 1}
True
>>> {1, 5, 10}.issuperset({5, 10, 1})
True
>>> {1, 5, 10, 8} >= {5, 10, 1}
True
>>> {1, 5, 10, 8}.issuperset({5, 10, 1})
True
3.2. Математические операции с множествами Python
-
Объединение множеств
Объединение двух множеств называется множество, состоящее из всех уникальный элементов обоих множеств. Для объединения множеств можно воспользоваться оператором | или методом union.
>>> {1, 2, 3, 4} | {3, 4, 5, 6, 7}
{1, 2, 3, 4, 5, 6, 7}
>>> {1, 2, 3, 4}.union({3, 4, 5, 6, 7})
{1, 2, 3, 4, 5, 6, 7}
-
Пересечение множеств
При пересечении двух множеств, получается множество, состоящее из всех уникальных элементов, входящих в оба множества. Пересечение можно вычислить оператором & или методом intersection.
>>> {1, 2, 3, 4} & {3, 4, 5, 6, 7}
{3, 4}
>>> {1, 2, 3, 4}.intersection({3, 4, 5, 6, 7})
{3, 4}
-
Разность множеств
Разность двух множеств является множество, состоящее из элементов левого операнда, не входящих в правый. Разность можно вычислить оператором - или методом difference.
>>> {1, 2, 3, 4} - {3, 4, 5, 6, 7}
{1, 2}
>>> {1, 2, 3, 4}.difference({3, 4, 5, 6, 7})
{1, 2}
-
Симметрическая разность множеств
Симметрической разностью двух множеств является множество, состоящее из элементов каждого множества, не входящих в другое множество. Симметрическую разность можно вычислить оператором ^ или методом symmetric_difference.
>>> {1, 2, 3, 4} ^ {3, 4, 5, 6, 7}
{1, 2, 5, 6, 7}
>>> {1, 2, 3, 4}.symmetric_difference({3, 4, 5, 6, 7})
{1, 2, 5, 6, 7}
-
Непересекающиеся множества
Непересекающимися множествами называются множества, если они оба не содержат общих элементов. Проверка выполняется методом isdisjoint.
>>> {1, 2, 3, 4}.isdisjoint({3, 4, 5, 6, 7})
False
>>> {1, 2, 3, 4}.isdisjoint({5, 6, 7})
True
3.3. Математические операции с изменяемыми множествами
В предыдущем разделе мы, выполняя математические операции, создавали новое множество, но также вы можете изменить существующее множество.
- Расширенное присваивание с объединением |= выполняет операцию объединения множеств, как и оператор |, но |= изменяет свой левый операнд. Также вы можете воспользоваться методом update.
>>> numbers = {1, 4, 6}
>>> numbers |= {2, 3, 4, 5}
>>> numbers
{1, 2, 3, 4, 5, 6}
>>> numbers = {1, 4, 6}
>>> numbers.update({7,8,9,10})
>>> numbers
{1, 4, 6, 7, 8, 9, 10}
- Расширенное присваивание с пересечением &= или intersection_update
- Расширенное присваивание с разностью -= или difference_update
- Расширенное присваивание с симметрической разностью ^= или symmetric_difference_update
4. Добавление и удаление элементов
-
метод add()
Метод add множества добавляет свой аргумент, если он еще не входит в множество, в противном случае множество остается без изменения.
>>> numbers = {1, 4, 6}
>>> numbers.add(5)
>>> numbers
{1, 4, 5, 6}
>>> numbers.add(4)
>>> numbers
{1, 4, 5, 6}
-
метод remove()
Метод remove() множества удаляет свой аргумент из множества. Если значение отсутствует, то происходит ошибка KeyError:
>>> numbers = {1, 4, 6}
>>> numbers.remove(4)
>>> numbers
{1, 6}
-
метод discard()
Метод discard множества также удаляет аргумент, но в случае его отсутствия ошибка не происходит
>>> numbers = {1, 4, 6}
>>> numbers.discard(2)
>>> numbers
{1, 4, 6}
-
метод pop()
Метод pop() множества удаляет элемент и возвращает его:
>>> numbers = {1, 4, 6, 7, 10, 45, 11}
>>> numbers.pop()
1
-
метод clear()
Метод clear() очищает множество:
>>> numbers = {1, 4, 6}
>>> numbers.clear()
>>> numbers
set()
5. Трансформация множеств на Python
Трансформация множеств определяется в фигурных скобках {}. Создадим множество из списка, которое содержит только четные значения:
>>> numbers = [1, 4, 8, 11, 15, 15, 16, 48, 23, 58]
>>> evens = {item for item in numbers if item % 2 == 0}
>>> evens
{4, 8, 16, 48, 58}