Операции над множествами | Python: Cловари и множества
Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером
Если при изучении множеств остановиться на создании и модифицировании, может показаться, что множества не сильно-то и отличаются от списков. Кажется, что они просто позволяют быстрее проверить вхождение элемента, но при этом не поддерживают механизм срезов.
На самом деле, есть более важные аспекты, которые мы и изучим в этом уроке.
Проверка на равенство
Сопоставление множеств — это довольно мощный инструмент. Давайте проверим два множества на равенство:
set([1, 2, 3, 2, 1]) == {3, 1, 2} # True
Можно подумать, что два множества равны, если каждый отдельный элемент одного множества содержится и во втором. Эта догадка близка к истине, но вспомним, что коллекции в Python хранят только ссылки на объекты. Множества равны, если ссылаются на одни и те же объекты. Одинаковые ссылки равны, но при этом могут быть равны и разные объекты.
Дело в том, что в Python есть специальный протокол проверки на равенство. Большинство встроенных типов данных поддерживает этот протокол. Мы можем проверять на равенство числа, строки, булевы значения. А еще можем приравнивать кортежи, списки, словари.
Здесь Python поступает очень разумно. Если вы приравняете две коллекции одного типа, то эти коллекции будут считаться равными, если их элементы попарно равны с точки зрения протокола. Посмотрите:
[1, 2, ["foo", "bar"]] == [1, 2, ["foo"] + ["bar"]] # True (1, True, []) == (1, True, []) # True {"a": 1, "b": 2} == {"b": 2, "a": 1} # True
Словари равны, если порядок ключей разный — лишь бы были равны значения по соответствующим ключам и сами наборы ключей были одинаковыми.
Вот и множества равны, если содержат одинаковые наборы равных попарно элементов.
Объединение множеств
По аналогии с множествами в математике, множества в Python поддерживают операцию объединения (union). Эта операция не объединяет множества, а возвращает новый объект.
Этот объект — это такое множество, которое содержит все элементы, содержащиеся хотя бы в одном из оригинальных множеств. По смыслу объединение похоже на операцию «ИЛИ» из булевой логики: элемент будет присутствовать в объединении, если он присутствует в первом исходном множестве ИЛИ во втором. Так это выглядит на схеме:
Для объединения множеств в Python используется оператор |
:
visited_by_masha = {'Paris', 'London'} visited_by_kolya = {'Moscow', 'Paris'} visited_by_kolya | visited_by_masha # {'London', 'Moscow', 'Paris'}
Пересечение множеств
Еще есть «операция И» — пересечение множеств (intersection). В пересечение входят элементы, присутствующие в первом из оригинальных множеств И во втором:
В Python оператор пересечения — &
:
visited_by_masha = {'Paris', 'London'} visited_by_kolya = {'Moscow', 'Paris'} visited_by_kolya & visited_by_masha # {'Paris'}
Разность множеств
Подмножества и надмножества
Одно множество является подмножеством другого (subset), если все элементы первого входят во второе, но второе может содержать еще и другие элементы. Второе в этом случае является надмножеством для первого (superset):
При этом равные множества являются друг для друга одновременно и подмножествами и надмножествами.
В Python соотношение множеств можно проверить с помощью методов issubset
и issuperset
:
a = {1, 2, 3, 4} b = {3, 4}
Операции с множествами Python — шпаргалка для начинающих
0 ∞Множество — это неупорядоченный набор элементов. Каждый элемент уникален (не имеет дубликатов) и должен быть неизменным (его нельзя изменить). Но само множество можно изменять: добавлять или удалять элементы из него.
- set python 3 или как создать множество?
- Как изменять множества в Python
- Как удалить элементы из множества?
- Операции с множествами Python
- Объединение множеств
- Пересечение множеств питон (python)
- Определение разницы множеств
- Симметричная разница множеств
- Методы для работы с множествами в Python
- Другие операции над множествами
- Проверка принадлежности к множеству
- Итерация множества
- Встроенные функции с множествами
- Python Frozenset
Множество создается размещением с помощью функции set(). При этом элементы экранируются фигурными скобками и разделяются запятыми.
Множество может содержать любое количество элементов. Они могут быть различных типов. Но множество не может содержать изменяемый элемент, такой как список или словарь.
# множество целых чисел my_set = {1, 2, 3} print(my_set) # множество значений разных типов my_set = {1. 0, "Hello", (1, 2, 3)} print(my_set)
Другие примеры:
# множество не содержит дубликатов # Вывод: {1, 2, 3, 4} my_set = {1,2,3,4,3,2} print(my_set) # множество не может содержать изменяемых значений # здесь [3, 4] - это изменяемый список # Если вы раскомментируете строку #12, # это приведет к ошибке. # TypeError: unhashable type: 'list' #my_set = {1, 2, [3, 4]} # мы можем создать множество из этого списка # Вывод: {1, 2, 3} my_set = set([1,2,3,2]) print(my_set)
Создать пустое множество сложнее. Пустые фигурные скобки {} создадут пустой словарь Python. Чтобы создать множество без элементов, нужно вызвать функцию set() без аргументов.
# инициализируем a с помощью {} a = {} # проверяем тип данных a # Вывод: <class 'dict'> print(type(a)) # инициализируем a с помощью set() a = set() # проверяем тип данных a # Вывод: <class 'set'> print(type(a))
Множества могут быть изменены. Но элементы в них неупорядоченные, поэтому индексирование не имеет смысла.
Нельзя получить доступ или изменить элемент множества, используя для этого индексацию или срез. Множество их не поддерживает.
Можно добавить один элемент, используя метод add(), несколько — используя метод update(). Он может принимать в качестве аргумента кортежи, списки, строки или другие множества. Во всех случаях дубликаты невозможны.
# инициализируем my_set my_set = {1,3} print(my_set) # если вы раскомментируете строку 9, # то получите ошибку # TypeError: 'set' object does not support indexing #my_set[0] # добавление элемента # Вывод: {1, 2, 3} my_set.add(2) print(my_set) # добавление нескольких элементов # Вывод: {1, 2, 3, 4} my_set.update([2,3,4]) print(my_set) # добавление списка и множества # Вывод: {1, 2, 3, 4, 5, 6, 8} my_set.update([4,5], {1,6,8}) print(my_set)
Результат работы программы:
{1, 3} {1, 2, 3} {1, 2, 3, 4} {1, 2, 3, 4, 5, 6, 8}
Это можно сделать с помощью методов discard() и remove(). Различие между ними состоит в том, что при использовании discard(), если элемент не существует во множестве, оно остается неизменным. А метод remove() выдаст ошибку.
Следующий пример иллюстрирует это.
# инициализируем my_set my_set = {1, 3, 4, 5, 6} print(my_set) # удаляем элемент # Вывод: {1, 3, 5, 6} my_set.discard(4) print(my_set) # удаляем элемент # Вывод: {1, 3, 5} my_set.remove(6) print(my_set) # удаляем элемент, # который отсутствует в my_set # Вывод: {1, 3, 5} my_set.discard(2) print(my_set) # удаляем элемент, # который отсутствует в my_set # Если вы раскомментируете строку 27, # то получите ошибку. # Вывод: KeyError: 2 #my_set.remove(2)
Точно так же можно удалить и вернуть элемент, используя метод pop(). Но нет способа определить, какой элемент будет извлечен.
Мы также можем удалить все элементы из множества, используя метод clear().
# инициализируем my_set # Вывод: множество уникальных элементов my_set = set("HelloWorld") print(my_set) # извлекаем элемент # Вывод: случайный элемент print(my_set.pop()) # извлекаем еще один элемент # Вывод: случайный элемент my_set.pop() print(my_set) # очищаем my_set #Вывод: set() my_set.clear() print(my_set)
Множества могут использоваться для выполнения математических операций: объединение, пересечение и симметричная разница.
Рассмотрим следующие два множества:
>>> A = {1, 2, 3, 4, 5} >>> B = {4, 5, 6, 7, 8}
Объединение A и B — это множество всех элементов из обоих множеств.
Объединение осуществляется с помощью оператора |. Эту же операцию можно осуществить с помощью метода union().
# инициализируем A и B A = {1, 2, 3, 4, 5} B = {4, 5, 6, 7, 8} # используем оператор | # Вывод: {1, 2, 3, 4, 5, 6, 7, 8} print(A | B)
Протестируйте следующие примеры:
# используем функцию union >>> A.union(B) {1, 2, 3, 4, 5, 6, 7, 8} # используем функцию union для B >>> B.union(A) {1, 2, 3, 4, 5, 6, 7, 8}
Пересечение A и B – операция получения набора элементов, которые являются общими для обоих множеств.
Пересечение осуществляется с помощью оператора &. Эту же операцию можно произвести с помощью метода intersection().
# инициализируем A и B A = {1, 2, 3, 4, 5} B = {4, 5, 6, 7, 8} # используем оператор & # Вывод: {4, 5} print(A & B)
Протестируйте следующие примеры:
# используем функцию intersection для A >>> A.intersection(B) {4, 5} # используем функцию intersection для B >>> B.intersection(A) {4, 5}
Разница A и B (A — B) – операция получения множества элементов, которые принадлежат только A, но не принадлежат B. Точно так же, B — A представляет собой множество элементов принадлежащих B , но не принадлежащих А.
Разница определяется с помощью оператора -. или метода difference().
# инициализируем A и B A = {1, 2, 3, 4, 5} B = {4, 5, 6, 7, 8} # используем оператор - для A # Вывод: {1, 2, 3} print(A - B)
Протестируйте следующие примеры:
# используем функцию difference для A >>> A.difference(B) {1, 2, 3} # используем оператор - для B >>> B - A {8, 6, 7} # используем функцию difference для B >>> B. B)
Протестируйте следующие примеры:
# используем функцию symmetric_difference для A >>> A.symmetric_difference(B) {1, 2, 3, 6, 7, 8} # используем функцию symmetric_difference для B >>> B.symmetric_difference(A) {1, 2, 3, 6, 7, 8}
Список всех методов, которые доступны для работы с объектами множеств.
Методы множеств Python | |
Метод | Описание |
add() | Добавляет элемент во множество. |
clear() | Удаляет все элементы из множества. |
copy() | Возвращает копию множества. |
difference() | Возвращает разницу двух или более множеств в качестве нового множества. |
difference_update() | Удаляет все элементы другого множества из заданного множества. |
discard() | Удаляет элемент из множества, если он содержится в нем. |
intersection() | Возвращает пересечение двух множеств в качестве нового множества. |
intersection_update() | Обновляет множество пересечением с другим множеством. |
isdisjoint() | Возвращает значение True, если два множества имеют нулевое пересечение. |
issubset() | Возвращает значение True, если другое множество содержит это множество. |
issuperset() | Возвращает значение True, если это множество содержит другое множество. |
pop() | Удаляет и возвращает произвольный элемент множество. Выдает KeyError, если множество пусто. |
remove() | Удаляет элемент из набора. Если элемент не является членом множества, выдает KeyError. |
symmetric_difference() | Возвращает симметричную разницу двух множеств как новое множество. |
symmetric_difference_update() | Обновляет множество симметричной разницей между собой и другим множеством. |
union() | Возвращает объединение множеств в новом наборе. |
update() | Обновляет множество объединением с другим множеством. |
Мы можем проверить, существует ли элемент во множестве, используя ключевое слово in.
# инициализируем my_set my_set = set("apple") # проверяем, присутствует ли 'a' # Вывод: True print('a' in my_set) # проверяем, присутствует ли 'p' # Вывод: False print('p' not in my_set)
Используя цикл for, можно выполнить переборку каждого элемента во множестве.
>>> for letter in set("apple"): ... print(letter) ... a p e l
Встроенные функции, такие как all(), any(), enumerate(), len(), max(), min(), sorted(), sum() , используются с множеством для выполнения различных задач.
Встроенные функции для работы с множествами | |
Функция | Описание |
all() | Возвращает значение True, если все элементы множества являются true (или если множество пусто). |
any() | Возвращает значение True, если какой-либо элемент множества является true. Если множество пусто, возвращает значение False. |
enumerate() | Возвращает пронумерованный объект. Содержит индекс и значение всех элементов множества в виде пары. |
len() | Возвращает длину (количество элементов) множества. |
max() | Возвращает наибольший элемент во множестве. |
min() | Возвращает наименьший элемент во множестве. |
sorted() | Возвращает новый отсортированный список, состоящий из элементов множества (не сортирует само множество). |
sum() | Возвращает сумму всех элементов множества. |
Frozenset — это новый класс, который имеет характеристики множества. Но его элементы не могут быть изменены после назначения. В то время как кортежи представляют собой неизменяемые списки, Frozensets являются неизменяемыми множествами.
Frozenset может быть создан с помощью функции frozenset(). Этот тип данных поддерживает такие методы, как copy(), difference(), intersection(), isdisjoint(), issubset(), issuperset(), symmetric_difference() и union(). Но он не поддерживает методы добавления или удаления элементов.
# инициализируем A и B A = frozenset([1, 2, 3, 4]) B = frozenset([3, 4, 5, 6])
Протестируйте эти примеры.
>>> A.isdisjoint(B) False >>> A.difference(B) frozenset({1, 2}) >>> A | B frozenset({1, 2, 3, 4, 5, 6}) >>> A.add(3) ... AttributeError: 'frozenset' object has no attribute 'add'
Вадим Дворниковавтор-переводчик статьи «Python Sets»
Пожалуйста, оставляйте ваши мнения по текущей теме материала. Мы крайне благодарны вам за ваши комментарии, подписки, лайки, дизлайки, отклики!
Операции над множествами в Python (объединение, пересечение, симметричная разность и т. д.) В Python,
В этой статье описывается следующее содержимое. Основные операции:
Математические операции:
Тип Создайте объект set : {} , set() Создайте объект set с фигурными скобками {} 902 32 набора объектов можно создать, заключив элементы в фигурные скобки Если есть повторяющиеся значения, они игнорируются, и в качестве элементов остаются только уникальные значения. с = {1, 2, 2, 3, 1, 4} печать(и) печать (тип (ы)) # {1, 2, 3, 4} # <класс 'набор'> источник: set.py Тип с = {1. 23, 'abc', (0, 1, 2), 'abc'} печать(и) # {(0, 1, 2), 1.23, 'абв'} # с = {[0, 1, 2]} # TypeError: unhashable type: 'list' источник: set.py Даже если типы разные, например с = {100, 100,0} печать(и) # {100} источник: set.py Поскольку пустой с = {} печать(и) печать (тип (ы)) # {} # <класс 'дикт'> источник: set.py Создайте объект set с помощью set() При указании итерируемого объекта, такого как список или кортеж, в качестве аргумента создается объект л = [1, 2, 2, 3, 1, 4] печать (л) печать (тип (л)) # [1, 2, 2, 3, 1, 4] # <класс 'список'> s_l = набор (л) печать (s_l) печать (тип (s_l)) # {1, 2, 3, 4} # <класс 'набор'> источник: set.py Для неизменяемого fs_l = замороженный набор (l) печать (fs_l) печать (тип (fs_l)) # замороженный набор({1, 2, 3, 4}) # <класс 'замороженный набор'> источник: set.py Если аргумент опущен, создается пустой набор с = установить () печать(и) печать (тип (ы)) # набор() # <класс 'набор'> источник: set.py Вы можете использовать Используйте
л = [2, 2, 3, 1, 3, 4] l_unique = список (набор (l)) печать (l_unique) # [1, 2, 3, 4] источник: set. py См. следующую статью об удалении повторяющихся элементов в исходном порядке или извлечении только повторяющихся элементов.
Включение множеств Python предоставляет включение множеств, а также списков. Используйте фигурные скобки с = {i**2 для i в диапазоне (5)} печать(и) # {0, 1, 4, 9, 16} источник: set.py См. следующую статью для получения дополнительной информации о включении списков.
Получить количество элементов в наборе: len() Количество элементов множества можно получить с помощью встроенной функции с = {1, 2, 2, 3, 1, 4} печать(и) печать (длина (ы)) # {1, 2, 3, 4} № 4 источник: set.py Если вы хотите подсчитать количество вхождений в списке с повторяющимися элементами, см. следующую статью.
Добавить элемент в набор: add() Используйте метод с = {0, 1, 2} с.добавить(3) печать(и) # {0, 1, 2, 3} источник: set.py Удаление элемента из набора: discard() , remove() , pop() , clear() Используйте Метод с = {0, 1, 2} s.discard(1) печать(и) # {0, 2} с = {0, 1, 2} с. отбросить (10) печать(и) # {0, 1, 2} источник: set.py Метод с = {0, 1, 2} с.удалить(1) печать(и) # {0, 2} # с = {0, 1, 2} # с.удалить(10) # KeyError: 10 источник: set.py Метод с = {2, 1, 0} v = s.pop() печать(и) печать (v) # {1, 2} # 0 с = {2, 1, 0} печать (s.pop()) # 0 печать (s.pop()) № 1 печать (s.pop()) № 2 # печать(s.pop()) # KeyError: 'извлечь из пустого множества' источник: set.py Метод с = {0, 1, 2} с.очистить() печать(и) # набор() источник: set.py Союз: | оператор, объединение() Вы можете получить союз с с1 = {0, 1, 2} с2 = {1, 2, 3} с3 = {2, 3, 4} s_union = s1 | с2 печать (s_union) # {0, 1, 2, 3} s_union = s1. union(s2) печать (s_union) # {0, 1, 2, 3} источник: set.py Для Кроме того, не только s_union = s1.union(s2, s3) печать (s_union) # {0, 1, 2, 3, 4} s_union = s1.union(s2, [5, 6, 5, 7, 5]) печать (s_union) # {0, 1, 2, 3, 5, 6, 7} источник: set.py Пересечение: оператор и , пересечение() Вы можете получить пересечение с помощью оператора s_intersection = s1 и s2 печать (s_intersection) # {1, 2} s_intersection = s1.intersection(s2) печать (s_intersection) # {1, 2} s_intersection = s1.intersection(s2, s3) печать (s_intersection) # {2} 9с2 печать (s_симметричная_разница) # {0, 3} s_symmetric_difference = s1. symmetric_difference(s2) печать (s_симметричная_разница) # {0, 3} источник: set.py Проверить, является ли A подмножеством B: оператор <= , issubset() Проверить, является ли A подмножеством B, т. е. все ли элементы A содержатся в B используйте оператор с1 = {0, 1} с2 = {0, 1, 2, 3} печать (s1 <= s2) # Истинный печать (s1.issubset (s2)) # Истинный источник: set.py Как оператор Чтобы проверить, является ли набор правильным подмножеством, используйте оператор печать (s1 <= s1) # Истинный печать (s1.issubset (s1)) # Истинный печать (s1 < s1) # ЛОЖЬ источник: set.py Проверить, является ли A надмножеством B: >= оператор, issuperset() Чтобы проверить, является ли A надмножеством B, т. |