Множество (set) представляют еще один вид набора элементов. Для определения множества используются фигурные скобки, в которых перечисляются элементы:
| 1 2 | users = {"Tom","Bob","Alice", "Tom"}print(users) # {"Tom","Bob","Alice"} |
Обратите внимание, что несмотря на то, что функция print вывела один раз элемент «Tom», хотя в определении множества этот элемент содержится два раза. Все потому что множество содержит только уникальные значения.
Также для определения множества может применяться функция set(), в которую передается список или кортеж элементов:
| 1 | users3 = set(["Mike", "Bill", "Ted"]) |
Функцию set удобно применять для создания пустого множества:
| 1 | users = set() |
Для получения длины множества применяется встроенная функция len():
| 1 2 | users = {"Tom","Bob","Alice"}print(len(users)} # 3 |
Добавление элементов
Для добавления одиночного элемента вызывается метод add():
| 1 2 3 | users = set()users.add("Sam")print(users) |
Удаление элементов
Для удаления одного элемента вызывается метод remove(), в который передается удаляемый элемент. Но следует учитывать, что если такого элемента не окажется в множестве, то будет сгенерирована ошибка. Поэтому перед удалением следует проверять на наличие элемента с помощью оператора in:
| 1 2 3 4 5 6 | users = {"Tom", "Bob", "Alice"} user = "Tom"if user in users: users.remove(user)print(users) # {"Bob", "Alice"} |
Также для удаления можно использовать метод discard(), который не будет генерировать исключения при отсутствии элемента:
| 1 2 | user = "Tim"users.discard(user) |
Для удаления всех элементов вызывается метод clear():
| 1 | users.clear() |
Перебор множества
Для перебора элементов можно использовать цикл for:
| 1 2 3 4 | users = {"Tom","Bob","Alice"}for user in users:print(user) |
При переборе каждый элемент помещается в переменную user.
Операции с множествами
С помощью метода copy() можно скопировать содержимое одного множества в другую переменную:
| 1 2 | users = {"Tom","Bob","Alice"}users3 = users.copy() |
Метод union() объединяет два множества и возвращает новое множество:
| 1 2 3 4 5 | users = {"Tom","Bob","Alice"}users2 = {"Sam","Kate", "Bob"}users3 = users.union(users2)print(users3) # {"Bob", "Alice", "Sam", "Kate", "Tom"} |
Пересечение множеств позволяет получить только те элементы, которые есть одновременно в обоих множествах. Метод intersection() производит операцию пересечения множеств и возвращает новое множество:
| 1 2 3 4 5 | users = {"Tom","Bob","Alice"}users2 = {"Sam","Kate", "Bob"}users3 = users.intersection(users2)print(users3) # {"Bob"} |
Вместо метода intersection мы могли бы использовать операцию логического умножения:
| 1 2 3 4 | users = {"Tom","Bob","Alice"}users2 = {"Sam","Kate", "Bob"}print(users & users2) # {"Bob"} |
В этом случае мы получили бы тот же результат.
Еще одна операция — разность множеств возвращает те элементы, которые есть в первом множестве, но отсутствуют во втором. Для получения разности множеств можно использовать метод difference или операцию вычитания:
| 1 2 3 4 5 6 | users = {"Tom","Bob","Alice"}users2 = {"Sam","Kate", "Bob"}users3 = users.difference(users2)print(users3) # {"Tom", "Alice"}print(users - users2) # {"Tom", "Alice"} |
Отношения между множествами
Метод issubset позволяет выяснить, является ли текущее множество подмножеством (то есть частью) другого множества:
| 1 2 3 4 5 | users = {"Tom", "Bob", "Alice"}superusers = {"Sam", "Tom", "Bob", "Alice", "Greg"}print(users.issubset(superusers)) # Trueprint(superusers.issubset(users)) # False |
Метод issuperset, наоборот, возвращает True, если текущее множество является надмножеством (то есть содержит) для другого множества:
| 1 2 3 4 5 | users = {"Tom", "Bob", "Alice"}superusers = {"Sam", "Tom", "Bob", "Alice", "Greg"} print(users.issuperset(superusers)) # Falseprint(superusers.issuperset(users)) # True |
frozen set
Тип frozen set является видом множеств, которое не может быть изменено. Для его создания используется функция frozenset:
| 1 | users = frozenset({"Tom", "Bob", "Alice"}) |
В функцию frozenset передается набор элементов — список, кортеж, другое множество.
В такое множество мы не можем добавить новые элементы, как и удалить из него уже имеющиеся. Собственно поэтому frozen set поддерживает ограниченный набор операций:
len(s): возвращает длину множестваx in s: возвращает True, если элемент x присутствует в множестве sx not in s: возвращает True, если элемент x отсутствует в множестве ss.issubset(t): возвращает True, если t содержит множество ss.issuperset(t): возвращает True, если t содержится в множестве ss.union(t): возвращает объединение множеств s и ts.intersection(t): возвращает пересечение множеств s и ts.difference(t): возвращает разность множеств s и ts.copy(): возвращает копию множества s