Методы множеств Python – Полный справочник с примерами
Полный справочник по методам множеств Python: union, intersection, difference, update, add, remove, discard, copy, isdisjoint и другие с примерами.
Множества в Python — это неупорядоченные коллекции уникальных хешируемых элементов. Поскольку множества реализуют математическое понятие множества, они поставляются с богатым набором встроенных методов для объединения, сравнения и изменения. В этой главе рассматриваются все встроенные методы множеств с понятными примерами, ожидаемыми результатами и рекомендациями по выбору подходящего метода.
Если вы только знакомитесь с множествами, сначала прочитайте Множества Python, чтобы понять, как создаются множества и чем они отличаются от списков и кортежей.
Создание множеств
Используйте фигурные скобки {} или конструктор set() для создания множества. Конструктор также принимает любой итерируемый объект — список, кортеж или строку — и автоматически удаляет дубликаты.
fruits = {'apple', 'banana', 'cherry'}
colors = set(['red', 'green', 'blue']) # from a list
vowels = set('aeiou') # from a string → {'a', 'e', 'i', 'o', 'u'}
empty = set() # NOT {} — that creates an empty dictМножества неупорядочены: порядок вывода элементов может отличаться между запусками и версиями Python.
Методы операций над множествами
Эти методы объединяют или сравнивают два и более множества, не изменяя исходные.
union()
union(*others) возвращает новое множество, содержащее каждый элемент, присутствующий в текущем множестве или в любом из others.
Оператор | является эквивалентным сокращением для двух множеств: A | B.
Когда использовать: объединение нескольких коллекций с одновременным удалением дубликатов.
intersection()
intersection(*others) возвращает новое множество, содержащее только элементы, которые присутствуют в текущем множестве и в каждом из others.
Оператор & является сокращением для двух множеств: A & B.
Когда использовать: поиск общих элементов — например, пользователей, которые кликнули и по объявлению A, и по объявлению B.
difference()
difference(*others) возвращает новое множество элементов, которые есть в текущем множестве, но отсутствуют в любом из others.
Оператор - является сокращением: A - B.
Когда использовать: исключение одной группы из другой — например, поиск товаров, которые есть в наличии, но ещё не отгружены.
symmetric_difference()
symmetric_difference(other) возвращает новое множество элементов, которые присутствуют ровно в одном из двух множеств — элементы, которые не являются общими.
Оператор ^ является сокращением: A ^ B.
Когда использовать: обнаружение изменений между двумя снимками состояния — например, файлы, добавленные или удалённые между двумя листингами директории.
issubset()
issubset(other) возвращает True, если каждый элемент текущего множества также содержится в other.
Оператор <= является эквивалентом; используйте < для проверки строгого подмножества (A меньше B и полностью содержится в нём).
issuperset()
issuperset(other) возвращает True, если текущее множество содержит каждый элемент из other.
A = {1, 2, 3, 4, 5}
B = {2, 3}
print(A.issuperset(B)) # True
print(B.issuperset(A)) # FalseОператор >= является эквивалентом; используйте > для проверки строгого надмножества.
isdisjoint()
isdisjoint(other) возвращает True, если два множества не имеют общих элементов — их пересечение пусто.
A = {1, 2, 3}
B = {4, 5, 6}
C = {3, 4, 5}
print(A.isdisjoint(B)) # True — no overlap
print(A.isdisjoint(C)) # False — 3 is in bothКогда использовать: проверка непересекающихся категорий, проверка того, что два набора разрешений являются взаимоисключающими.
Методы изменения на месте
Эти методы изменяют множество на месте и возвращают None — они не создают новое множество.
update()
update(*others) добавляет все элементы из одного или нескольких итерируемых объектов в текущее множество, игнорируя дубликаты.
update() принимает любой итерируемый объект, не только другое множество — список, кортеж или строка тоже подойдут. Оператор |= является сокращением для двух множеств.
intersection_update()
intersection_update(*others) оставляет только те элементы, которые также присутствуют в каждом из others, отбрасывая всё остальное.
A = {1, 2, 3, 4}
B = {2, 3, 4, 5}
A.intersection_update(B)
print(A) # {2, 3, 4}Оператор &= является сокращением.
difference_update()
difference_update(*others) удаляет из текущего множества каждый элемент, присутствующий в любом из others.
A = {1, 2, 3, 4}
B = {3, 4, 5}
A.difference_update(B)
print(A) # {1, 2}Оператор -= является сокращением.
symmetric_difference_update()
symmetric_difference_update(other) оставляет только элементы, присутствующие ровно в одном из двух множеств, изменяя множество на месте.
A = {1, 2, 3}
B = {2, 3, 4}
A.symmetric_difference_update(B)
print(A) # {1, 4}Оператор ^= является сокращением.
Методы работы с элементами
add()
add(elem) вставляет elem в множество. Если elem уже присутствует, множество не изменяется.
Смотрите Добавление элементов в множество для получения дополнительных способов заполнения множества.
remove()
remove(elem) удаляет elem из множества. Вызывает KeyError, если elem отсутствует.
Используйте remove(), когда элемент обязан быть в множестве и его неожиданное отсутствие является программной ошибкой, которую стоит отобразить.
discard()
discard(elem) удаляет elem из множества. Не вызывает ошибку, если elem отсутствует.
Используйте discard(), когда элемент может присутствовать или отсутствовать в множестве, и вам просто нужно его убрать.
pop()
pop() удаляет и возвращает произвольный элемент. Поскольку множества неупорядочены, невозможно предсказать, какой элемент будет удалён. Вызывает KeyError, если множество пусто.
Смотрите Удаление элементов из множества для сравнения всех подходов к удалению.
clear()
clear() удаляет все элементы, оставляя пустое множество.
Обратите внимание, что print(set()) выводит set(), а не {}, чтобы отличить пустое множество от пустого словаря.
copy()
copy() возвращает поверхностную копию множества. Изменение копии не влияет на оригинал.
A = {1, 2, 3}
B = A.copy()
B.add(4)
print(A) # {1, 2, 3} — unchanged
print(B) # {1, 2, 3, 4}Это важно, потому что простое присваивание (B = A) создаёт вторую ссылку на то же множество — изменения в B затронут и A.
Метод или оператор: что выбрать?
Большинство операций над множествами имеют как форму метода, так и форму оператора:
| Операция | Метод | Оператор |
|---|---|---|
| Объединение | A.union(B) | A | B |
| Пересечение | A.intersection(B) | A & B |
| Разность | A.difference(B) | A - B |
| Симметричная разность | A.symmetric_difference(B) | A ^ B |
| Объединение на месте | A.update(B) | A |= B |
| Пересечение на месте | A.intersection_update(B) | A &= B |
| Разность на месте | A.difference_update(B) | A -= B |
| Симм. разность на месте | A.symmetric_difference_update(B) | A ^= B |
| Подмножество | A.issubset(B) | A <= B |
| Надмножество | A.issuperset(B) | A >= B |
Ключевое отличие: методы принимают любой итерируемый объект в качестве аргумента, тогда как операторы требуют, чтобы обе стороны были множествами. Используйте методы, когда хотите работать со списком или кортежем напрямую, без предварительного преобразования:
tags = {'python', 'web'}
new_tags = ['python', 'ml', 'data']
tags.update(new_tags) # works — list is fine
# tags |= new_tags # TypeError — operator needs a set
print(tags) # {'python', 'web', 'ml', 'data'}Полный справочник методов множеств
| Метод | Описание |
|---|---|
add(elem) | Добавляет elem в множество; не имеет эффекта, если уже присутствует. |
clear() | Удаляет все элементы, оставляя пустое множество. |
copy() | Возвращает поверхностную копию множества. |
difference(*others) | Возвращает новое множество с элементами, отсутствующими в любом из others. |
difference_update(*others) | Удаляет из множества все элементы, найденные в others. |
discard(elem) | Удаляет elem, если присутствует; не вызывает ошибку при отсутствии. |
intersection(*others) | Возвращает новое множество элементов, общих для множества и всех others. |
intersection_update(*others) | Оставляет только элементы, найденные в множестве и всех others. |
isdisjoint(other) | Возвращает True, если множество и other не имеют общих элементов. |
issubset(other) | Возвращает True, если каждый элемент множества содержится в other. |
issuperset(other) | Возвращает True, если множество содержит каждый элемент из other. |
pop() | Удаляет и возвращает произвольный элемент; вызывает KeyError, если пусто. |
remove(elem) | Удаляет elem; вызывает KeyError, если отсутствует. |
symmetric_difference(other) | Возвращает элементы, присутствующие ровно в одном из двух множеств. |
symmetric_difference_update(other) | Обновляет множество до симметричной разности на месте. |
union(*others) | Возвращает новое множество со всеми элементами из множества и всех others. |
update(*others) | Добавляет все элементы из others в множество. |