Наборы в Python

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

  • Каждый элемент в наборе уникален
  • Элементы набора неизменяемы, т.е. они не могут быть изменены, но сам набор является изменяемым.
  • Наборы неупорядочены

Основы

1. Создание набора:

В Python список элементов, разделенных запятыми, заключенный в фигурные скобки, представляет собой набор.

set_of_numbers = {1,2,3,4,5}
mixed_set = {'a',1,2,'c','d'}

Определение пустого набора немного сложно, поскольку в python пустые фигурные скобки {} используются для определения словаря. Итак, чтобы определить набор, мы используем функцию set(). Эту функцию также можно использовать для создания набора из списка.

empty_set = set()
set_from_list = set([1,2,3,4])

2. Добавление элементов в набор:

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

demo_set = set()
demo_set.add(2)
demo_set.update([2,4,5])
demo_set.update((1,3))
print(demo_set)
--------------------------------------------------------------------
{1,2,3,4,5}

3. Удаление элементов из набора:

Для удаления элементов можно использовать методы discard() и remove(). Единственная разница между этими двумя методами заключается в том, что метод удаления вызовет ошибку, если удаляемый элемент отсутствует в наборе.

demo_set = {1,2,3,4,5}
demo_set.remove(2)
demo_set.discard(3)
print(demo_set)
--------------------------------------------------------------------
{1,4,5}

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

4. Доступ к элементам из набора:

Чтобы проверить, присутствует ли элемент в наборе, мы можем использовать следующий синтаксис, который вернет либо true, либо false.

demo_set = {1,2,3,4,5}
print(2 in demo_set)
print('a' in demo_set)
--------------------------------------------------------------------
True
False

Мы также можем перебирать набор, используя цикл for.

demo_set = {1,2,3}
for element in demo_set:
    print(element)
--------------------------------------------------------------------
1
2
3

Установить операции

Основное преимущество использования наборов в python - это математические операции над наборами, которые предоставляет Python, такие как объединение наборов, пересечение, разность, симметричная разница и т. Д.

1. Установить союз:

Объединение наборов создаст набор со всеми элементами из обоих наборов. Объединение может быть выполнено с использованием метода union() или оператора |.

set_a = {1,2,3}
set_b = {3,4,5}
set_c = set_a.union(set_b) 
#OR
set_c = set_a | set_b
print(set_c)
--------------------------------------------------------------------
{1,2,3,4,5}

2. Установить пересечение:

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

set_a = {1,2,3}
set_b = {3,4,5}
set_c = set_a.intersection(set_b) 
#OR
set_c = set_a & set_b
print(set_c)
--------------------------------------------------------------------
{3}

3. Установить разницу:

Разница в наборах создаст набор со всеми элементами, которые находятся в наборе 1, а не в наборе 2. Различие может быть выполнено с использованием метода difference() или -operator.

set_a = {1,2,3}
set_b = {3,4,5}
set_c = set_a.difference(set_b) 
#OR
set_c = set_a - set_b
print(set_c)
--------------------------------------------------------------------
{1,2}

Существует также метод под названием difference_update(), который обновляет набор с учетом отличий от обоих наборов.

set_a = {1,2,3}
set_b = {3,4,5}
set_a.difference_update(set_b)
print(set_a)
--------------------------------------------------------------------
{1,2}

4. Установите симметричную разницу:

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

set_a = {1,2,3}
set_b = {3,4,5}
set_c = set_a.symmetric_difference(set_b) 
#OR
set_c = set_a ^ set_b
print(set_c)
--------------------------------------------------------------------
{1,2,4,5}

Точно так же существует метод symmetric_difference_update(), который обновляет набор с симметричной разницей из обоих наборов.

set_a = {1,2,3}
set_b = {3,4,5}
set_a.symmetric_difference_update(set_b) 
print(set_a)
--------------------------------------------------------------------
{1,2,4,5}

5. Непересекается:

isdisjoint() метод возвращает True, если в обоих наборах нет общих элементов, иначе возвращает False.

set_a = {1,2,3}
set_b = {4,5}
print(set_a.isdisjoint(set_b))
--------------------------------------------------------------------
True

6. Подмножество:

issubset() метод возвращает True, если набор 2 содержит все элементы из набора 1, иначе возвращает False.

set_a = {1,2,3}
set_b = {1,2,3,4,5}
print(set_a.issubset(set_b))
--------------------------------------------------------------------
True

7. Является суперсетом:

issuperset() метод возвращает True, если набор 1 содержит все элементы из набора 2, иначе возвращает False.

set_a = {1,2,3,4,5}
set_b = {1,2,3}
print(set_a.issuperset(set_b))
--------------------------------------------------------------------
True

Случаи применения

Существует множество реальных вариантов использования наборов в Python, некоторые из них перечислены ниже.

1. Проверка наличия элемента в списке:

Чтобы проверить, присутствует ли элемент в списке, мы всегда можем использовать цикл for для итерации и проверки, или также мы можем использовать оператор in.

list_a = [1,2,3,4,5]
for i in list_a: 
    if(i == 2) : 
        print True
print(2 in set_a)
--------------------------------------------------------------------True
True

Но более эффективный способ сделать это - преобразовать список в набор и проверить наличие с помощью оператора in.

list_a = [1,2,3,4,5]
set_a = set(list_a)
print(2 in set_a)
--------------------------------------------------------------------
True

2. Составление списка уникальных элементов:

Чтобы составить список, в котором все элементы списка уникальны, нам просто нужно преобразовать список в набор, а затем преобразовать его обратно в список.

list_a = [1,5,2,3,3,4,5,1]
set_a = set(list_a)
list_a = list(set_a)
print(list_a)
--------------------------------------------------------------------
[1, 2, 3, 4, 5]

3. Объединение наборов, если один или несколько элементов являются общими:

Чтобы объединить наборы, которые имеют общие элементы, мы можем либо проверить, не являются ли наборы непересекающимися, используя метод isdisjoint(), или мы можем проверить пересечение, используя метод intersection(), тогда, если оба набора действительно пересекаются, мы можем использовать метод union() для объединения наборов.

Если у нас есть список таких наборов, мы должны использовать циклы и рекурсию для объединения всех наборов.

def merge_if_intersect(m_list):
    for i,set1 in enumerate(m_list):
        for j,set2 in enumerate(m_list[i+1:],i+1):
           if not set1.isdisjoint(set2): #or set1.intersection(set2)
              m_list[i]=set1.union(m_list.pop(j))
              return merge_if_intersect(m_list)
    return m_list
list_a = [{1,2,3},{4,5},{5,6},{3,7},{8}]
merged_list = merge_if_intersect(list_a)
print(merged_list)
--------------------------------------------------------------------
[{1, 2, 3, 7}, {4, 5, 6}, {8}]

использованная литература