Наборы в 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}]