Множества

В соответствии с математическими обозначениями, множества пишутся в фигурных скобках. Элемент может содержаться в множестве только один раз. Порядок элементов в множестве не имеет значения, поэтому питон их сортирует. Элементы множества могут быть любых типов. Множества используются существенно реже, чем списки. Но иногда они бывают весьма полезны. Например, когда я собирался делать апгрейд системы на сервере, я написал на питоне программу, которая строила множество пакетов, установленных в системе до апгрейда; множество пакетов, имеющихся на инсталляционных CD; имеющихся на основных сайтах с дополнительными пакетами, и т.д. И она мне помогла восстановить функциональность после апгрейда.

In [1]:
s={0,1,0,5,5,1,0}
s
Out[1]:
{0, 1, 5}

Принадлежит ли элемент множеству?

In [2]:
1 in s, 2 in s, 1 not in s
Out[2]:
(True, False, False)

Множество можно получить из списка, или строки, или любого объекта, который можно использовать в for цикле (итерабельного).

In [3]:
l=[0,1,0,5,5,1,0]
set(l)
Out[3]:
{0, 1, 5}
In [4]:
set('абба')
Out[4]:
{'а', 'б'}

Как записать пустое множество? Только так.

In [5]:
set()
Out[5]:
set()

Дело в том, что в фигурных скобках в питоне пишутся также словари (мы будем их обсуждать в следующем параграфе). Когда в них есть хоть один элемент, можно отличить словарь от множества. Но пустые фигурные скобки означают пустой словарь.

Работать с множествами можно как со списками.

In [6]:
len(s)
Out[6]:
3
In [7]:
for x in s:
    print(x)
0
1
5

Это генератор множества (set comprehension).

In [8]:
{i for i in range(5)}
Out[8]:
{0, 1, 2, 3, 4}

Объединение множеств.

In [9]:
s2=s|{2,5}
s2
Out[9]:
{0, 1, 2, 5}

Проверка того, является ли одно множество подмножеством другого.

In [10]:
s<s2, s>s2, s<=s2, s>=s2
Out[10]:
(True, False, True, False)

Пересечение.

In [11]:
s2&{1,2,3}
Out[11]:
{1, 2}

Разность и симметричная разность.

In [12]:
s2-{1,3,5}
Out[12]:
{0, 2}
In [13]:
s2^{1,3,5}
Out[13]:
{0, 2, 3}

Множества (как и списки) являются изменяемыми объектами. Добавление элемента в множество и исключение из него.

In [14]:
s2.add(4)
s2
Out[14]:
{0, 1, 2, 4, 5}
In [15]:
s2.remove(1)
s2
Out[15]:
{0, 2, 4, 5}

Как и в случае +=, можно скомбинировать теоретико-множественную операцию с присваиванием.

In [16]:
s2|={1,2}
s2
Out[16]:
{0, 1, 2, 4, 5}

Существуют также неизменяемые множества. Этот тип данных называется frozenset. Операции над такими множествами подобны обычным, только невозможно изменять их (добавлять и исключать элементы).