Списки, словари и множества в Python

2. Множества

Множество (set)

Множество в языке Python — это структура данных, эквивалентная множествам в математике. Элементы могут быть различных типов. Порядок элементов не определён.

Действия, которые можно выполнять с множеством:

  1. добавлять и удалять элементы,
  2. проверять принадлежность элемента множеству,
  3. перебирать его элементы,
  4. выполнять операции над множествами (объединение, пересечение, разность).

Операция “проверить принадлежность элемента” выполняется в множестве намного быстрее, чем в списке.

Элементами множества может быть любой неизменяемый тип данных: числа, строки, кортежи.

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

Задание множеств

Множество задается перечислением в фигурных скобках. Например:

A = {1, 2, 3}

Исключением явлеется пустое множество:

A = set()       # A -- множество
D = {}          # D -- не пустое множество, а пустой словарь!

Если функции set передать в качестве параметра список, строку или кортеж, то она вернет множество, составленное из элементов списка, строки, кортежа. Например:

>>> A = set('qwerty')
>>> print(A)
{'e', 'q', 'r', 't', 'w', 'y'}.

Каждый элемент может входить в множество только один раз.

>>> A = {1, 2, 3}
>>> B = {3, 2, 3, 1}
>>> print(A == B) # A и B — равные множества.
True
>>> set('Hello')
{'H', 'e', 'l', 'o'}

Работа с элементами множеств

ОперацияЗначениеТрудоемкость
x in Aпринадлежит ли элемент x множеству A (возвращают значение типа bool)O(1)
x not in Aто же, что not x in AO(1)
A.add(x)добавить элемент x в множество AO(1)
A.discard(x)удалить элемент x из множества AO(1)
A.remove(x)удалить элемент x из множества AO(1)
A.pop()удаляет из множества один случайный элемент и возвращает егоO(1)

Как мы видим, по времени стандартные оперцаии с одним элементом множества выполняются за O(1).

Поведение discard и remove различается тогда, когда удаляемый элемент отсутствует в множестве: discard не делает ничего, а метод remove генерирует исключение KeyError. Метод pop также генерирует исключение KeyError, если множество пусто.

При помощи цикла for можно перебрать все элементы множества:

Primes = {2, 3, 5, 7, 11}
for num im Primes:
    print(num)

Из множества можно сделать список при помощи функции list:

>>> A = {1, 2, 3, 4, 5}
>>> B = list(A)
[1, 2, 3, 4, 5]

Упражнение №2

Вывести на экран все элементы множества A, которых нет в множестве B.

A = set('bqlpzlkwehrlulsdhfliuywemrlkjhsdlfjhlzxcovt')
B = set('zmxcvnboaiyerjhbziuxdytvasenbriutsdvinjhgik')
for x in A:
    ...

Операции с множествами, обычные для математики

ОперацияЗначениеТрудоемкость
   
A | B
A.union(B)
Возвращает множество, являющееся объединением множеств A и B.O(len(A)+len(B))
A | = B
A.update(B)
Записывает в A объединение множеств A и B.O(len(A)+len(B))
A & B
A.intersection(B)
Возвращает множество, являющееся пересечением множеств A и B.O(min(len(A), len(B))
A &= B
A.intersection_update(B)
Записывает в A пересечение множеств A и B.O(min(len(A), len(B))
A - B
A.difference(B)
Возвращает разность множеств A и B (элементы, входящие в A, но не входящие в B).O(len(A)+len(B))
A -= B
A.difference_update(B)
Записывает в A разность множеств A и B.O(len(A)+len(B))
A ^ B
A.symmetric_difference(B)
Возвращает симметрическую разность множеств A и (элементы, входящие в A или в B, но не в оба из них одновременно).O(len(A)+len(B))
A ^= B
A.symmetric_difference_update(B)
Записывает в A симметрическую разность множеств A и B.O(len(A)+len(B))
A <= B
A.issubset(B)
Возвращает True, если A является подмножеством B.O(len(A))
A >=
B A.issuperset(B)
Возвращает True, если B является подмножеством A.O(len(B))
A < BЭквивалентно A <= B and A != BO(len(A))
A > BЭквивалентно A >= B and A != BO(len(B))

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