Основы программирования в Python

Алла Тамбовцева, НИУ ВШЭ

Множества

Иногда возникает необходимость проверять разные отношения между двумя наборами элементов. Например, проверить, есть ли у двух списков общие элементы. Для этого можно воспользоваться уже известным оператором in:

In [1]:
L1 = [1, 3, 4]
L2 = [1, 4, 5, 6]
In [2]:
for i in L2:
    if i in L1:
        print(i)
1
4

Но иногда удобно превратить списки в множества (sets) и выполнять операции, которые определены для множеств в математике: пересечение, объединение, разность и так далее.

In [3]:
set()  # пустое множество
Out[3]:
set()
In [4]:
set([1, 2, 6])  # множество, полученное из списка
Out[4]:
{1, 2, 6}

Важно иметь в виду, что в множествах (как в программировании, так и в математике) не может быть повторяющихся элементов. Поэтому, если в списке есть повторяющиеся значения, и они важны, превращать спискок в множество не стоит, так как можно потерять элементы.

In [5]:
set([1, 2, 6, 6, 1, 2])  # потеряли повторы
Out[5]:
{1, 2, 6}

Но зато с помощью множеств можно получить список уникальных элементов списка:

In [6]:
list(set([1, 2, 6, 6, 1, 2]))
Out[6]:
[1, 2, 6]

А теперь превратим два числовых списка в множества A и B и попробуем произвести некоторые операции.

In [7]:
A = set([1, 2, 4, 6])
B = set([2, 3, 6, 8])

Пересечение множеств A и B – общие элементы этих двух множеств ($A \cap B$):

In [8]:
A.intersection(B)
Out[8]:
{2, 6}

Объединение множеств A и B – все элементы множества A и множества B, конечно, без повторений ($A \cup B$):

In [9]:
A.union(B)
Out[9]:
{1, 2, 3, 4, 6, 8}

Разность множеств A и B – все элементы множества A, которых нет в B ($A\text{\\}B$).

In [10]:
A.difference(B)
Out[10]:
{1, 4}

Разность множеств B и A – все элементы множества B, которых нет в A ($B\text{\\}A$).

In [11]:
B.difference(A)
Out[11]:
{3, 8}

Симметрическая разность множеств A и B – все элементы А и B, которые не входят в пересечение этих множеств:

In [12]:
A.symmetric_difference(B)
Out[12]:
{1, 3, 4, 8}

Обратите внимание: результат, полученный после использования методов для множеств, тоже является множеством – элементы перечислены в фигурных скобках. Но при желании результат можно превратить в список:

In [13]:
list(A.symmetric_difference(B))
Out[13]:
[1, 3, 4, 8]

На множествах определены особые методы, которые облегчают сравнение наборов элементов. Например, можно проверить, являются ли множества A и B непересекающимися (не имеющими общих элементов):

In [14]:
A.isdisjoint(B)  # joint - пересекающиеся, disjoint - непересекающиеся
Out[14]:
False

Или проверить, является ли множество A подмножеством B (все элементы A входят в B):

In [15]:
A.issubset(B)
Out[15]:
False

Множество в Python, наверное, не такой распространенный объект как список, кортеж или словарь, но знать о них полезно, потому что в некоторых задачах использовать методы для множеств гораздо эффективнее, чем писать какие-то циклы с разными условиями.