Работа с множествами
Многие операции, которые можно использовать для других составных типов (например, списки, кортежи), не имеют смысла для множества.
Например, обращение по индексу и срезы. Однако Python позволяет выполнять ряд операций с элементами множества, которые имитируют операции с математическими множествами.
Большинство из этих операций можно выполнять двумя способами: операцией или определенным методом.
Объединение множеств
x1 = {'foo', 'bar', 'baz'}
x2 = {'baz', 'qux', 'quux'}
print(x1 | x2) # {'bar', 'baz', 'qux', 'quux', 'foo'}
print(x1.union(x2)) # {'bar', 'baz', 'qux', 'quux', 'foo'}
Операция объединения множеств (
|
) и аналогичный метод имеют тонкую разницу. Когда вы используете
|
оператор, оба операнда должны иметь тип
set
. Метод
union()
примет любой итерируемый объект в качестве аргумента, преобразует его во множество и затем выполнит объединение.
Примечание
Итерируемый объект (
iterable
) - это объект, который способен возвращать элементы по одному.
Обратите внимание на разницу
x1 = {'foo', 'bar', 'baz'}
print(x1.union(('baz', 'qux', 'quux'))) # {'baz', 'bar', 'quux', 'foo', 'qux'}
print(x1 | ('baz', 'qux', 'quux')) # builtins.TypeError:
# unsupported operand type(s) for |: 'set' and 'tuple'
Операции и методы для множеств
Ниже приведен список операций, доступных в Python. Некоторые выполняются оператором, некоторые - методом, а некоторые - обоими. Принцип, изложенный выше, обычно применяется: там, где ожидается множество, методы обычно принимают любой итерируемый элемент в качестве аргумента, но операторы требуют в качестве операндов объекты типа
set
.
Пояснение: записи в квадратных скобках указывают на то, что эта часть может быть опущена.
Название |
Метод |
Оператор |
Описание |
объединение |
x1.union(x2[, x3, …]) |
x1 | x2 [| x3 …] |
возвращает множество всех элементов, которые присутствуют либо в x1 либо в x2 (либо других) |
пересечение множеств |
x1.intersection(x2[, x3, …]) |
x1 & x2 [& x3 …] |
возвращает множество элементов, общих для x1 и x2 (и других) |
разница между множествами |
x1.difference(x2) |
x1 - x2 [- x3 …] |
возвращает множество элементов, которые есть в x1, но нет в x2 (только - поддерживает множественность) |
симметричная разница между множествами |
x1.symmetric_difference(x2) |
x1 ^ x2 [^ x3] |
возвращает множество элементов, которые есть в x1 или x2, но не в обоих сразу
(оператор ^ поддерживает множественность) |
общие элементы в наборах |
x1.isdisjoint(x2) |
нет |
возвращает True, если x1 и x2 не имеют общих элементов |
x1 подмножество x2 |
x1.issubset(x2) |
x1 <= x2 |
True, если x1 подмножество x2, иначе - False |
Правильное подмножество |
- |
x1 < x2 |
True, если x1 является правильным подмножеством x2 |
x1 надмножество x2 |
x1.issuperset(x2) |
x1 >= x2 |
True, если x1 содержит все элементы x2 |
правильное надмножество |
- |
x1 > x2 |
True, если x1 является правильным надмножеством x2 |
объединение множеств |
x1.update(x2[, x3 ...]) |
x1 |= x2 [| x3 ...] |
Добавляет к x1 элементы x2, которых нет в x1 |
пересечение множеств |
x1.intersection_update(x2[, x3 ...]) |
x1 &= x2 [& x3 ...] |
Обновляет x1, сохраняя элементы, которые есть в обоих множествах x1 и x2 |
разница множеств |
x1.difference_update(x2[, x3 ...]) |
x1 -= x2 [| x3 ...] |
Обновляет x1, удаляя элементы, найденные в x2 |
симметричная разность |
x1.symmetric_difference_update(x2) |
x1 ^= x2 |
Обновляет x1, сохраняя элементы, найденные в x1 ли x2, но не в обоих |