Рубрики
Без рубрики

Наборы в Python

Автор оригинала: Nicholas Samuel.

Наборы в Python

  • Вступление
  • Как создать набор
  • Доступ к Элементам Набора
  • Добавление элементов в набор
  • Удаление элементов из набора
  • Установить соединение
  • Установить Пересечение
  • Установить Разницу
  • Сравнение наборов
  • Методы Набора
  • Python FrozenSet
  • Вывод

Вступление

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

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

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

Как создать набор

Есть два способа, с помощью которых мы можем создавать наборы в Python.

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

Вот пример того, как создать набор в Python:

num_set = {1, 2, 3, 4, 5, 6}
print(num_set)

Выход

{1, 2, 3, 4, 5, 6}

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

string_set = {"Nicholas", "Michelle", "John", "Mercy"}
print(string_set)

Выход

{'Michelle', 'Nicholas', 'John', 'Mercy'}

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

Мы также можем создать набор с элементами разных типов. Например:

mixed_set = {2.0, "Nicholas", (1, 2, 3)}
print(mixed_set)

Выход

{2.0, 'Nicholas', (1, 2, 3)}

Все элементы вышеприведенного набора относятся к разным типам.

Мы также можем создать набор из списка. Это можно сделать, вызвав встроенную в Python функцию set () . Например:

num_set = set([1, 2, 3, 4, 5, 6])
print(num_set)

Выход

{1, 2, 3, 4, 5, 6}

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

num_set = set([1, 2, 3, 1, 2])
print(num_set)

Выход

{1, 2, 3}

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

num_set = {1, 2, 3, 1, 2}
print(num_set)

Выход

{1, 2, 3}

Опять же, набор удалил дубликаты и вернул только один из дубликатов элементов.

Создание пустого набора несколько сложно. Если вы используете пустые фигурные скобки {} в Python, вы создаете пустой словарь, а не пустой набор. Например:

x = {}
print(type(x))

Выход


Как показано в выходных данных, тип переменной x является словарем.

Чтобы создать пустой набор в Python, мы должны использовать функцию set() без передачи какого-либо значения для параметров, как показано ниже:

x = set()
print(type(x))

Выход


Вывод показывает, что мы создали набор.

Доступ к Элементам Набора

Python не предоставляет нам способа доступа к отдельному элементу набора. Однако мы можем использовать цикл for для перебора всех элементов набора. Например:

months = set(["Jan", "Feb", "March", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"])

for m in months:
    print(m)

Выход

March
Feb
Dec
Jan
May
Nov
Oct
Apr
June
Aug
Sep
July

Мы также можем проверить наличие элемента в наборе с помощью ключевого слова in , как показано ниже:

months = set(["Jan", "Feb", "March", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"])

print("May" in months)

Выход

True

Код вернул “True”, что означает, что элемент был найден в наборе. Аналогично, поиск элемента, который не существует в наборе, возвращает “False”, как показано ниже:

months = set(["Jan", "Feb", "March", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"])

print("Nicholas" in months)

Выход

False

Как и ожидалось, код вернул “False”.

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

Python позволяет добавлять новые элементы в набор с помощью функции add () . Например:

months = set(["Jan", "March", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"])

months.add("Feb")
print(months)

Выход

{'Oct', 'Dec', 'Feb', 'July', 'May', 'Jan', 'June', 'March', 'Sep', 'Aug', 'Nov', 'Apr'}

Пункт “Февраль” был успешно добавлен в набор. Если бы это был набор чисел, мы бы не передавали новый элемент в кавычки, как это было сделано для строки. Например:

num_set = {1, 2, 3}
num_set.add(4)
print(num_set)

Выход

{1, 2, 3, 4}

В следующем разделе мы обсудим, как удалить элементы из наборов.

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

Python позволяет нам удалить элемент из набора, но не использовать индекс, так как элементы набора не индексируются. Элементы могут быть удалены с помощью методов discard() или remove () .

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

Давайте продемонстрируем, как удалить элемент с помощью метода discard() :

num_set = {1, 2, 3, 4, 5, 6}
num_set.discard(3)
print(num_set)

Выход

{1, 2, 4, 5, 6}

Элемент 3 был удален из набора.

Аналогично, метод remove() можно использовать следующим образом:

num_set = {1, 2, 3, 4, 5, 6}
num_set.remove(3)
print(num_set)

Выход

{1, 2, 4, 5, 6}

Теперь давайте попробуем удалить элемент, который не существует в наборе. Давайте сначала воспользуемся методом discard() :

num_set = {1, 2, 3, 4, 5, 6}
num_set.discard(7)
print(num_set)

Выход

{1, 2, 3, 4, 5, 6}

Приведенный выше вывод показывает, что набор никак не пострадал. Теперь давайте посмотрим, что происходит, когда мы используем метод remove() в том же сценарии:

num_set = {1, 2, 3, 4, 5, 6}
num_set.remove(7)
print(num_set)

Выход

Traceback (most recent call last):
  File "C:\Users\admin\sets.py", line 2, in 
    num_set.remove(7)
KeyError: 7

Вывод показывает, что метод вызвал ошибку, когда мы попытались удалить элемент, которого нет в наборе.

С помощью метода pop() мы можем удалить и вернуть элемент. Поскольку элементы неупорядочены, мы не можем сказать или предсказать элемент, который будет удален. Например:

num_set = {1, 2, 3, 4, 5, 6}
print(num_set.pop())

Выход

1

Вы можете использовать тот же метод для удаления элемента и возврата элементов, оставшихся в наборе. Например:

num_set = {1, 2, 3, 4, 5, 6}
num_set.pop()
print(num_set)

Выход

{2, 3, 4, 5, 6}

Это элементы, оставшиеся в наборе.

Метод Python clear() помогает нам удалить все элементы из набора. Например:

num_set = {1, 2, 3, 4, 5, 6}
num_set.clear()
print(num_set)

Выход

set()

На выходе получается пустой set() без каких-либо элементов.

Установить соединение

Предположим, у нас есть два множества, А и В. Объединение двух множеств – это множество со всеми элементами из обоих множеств. Такая операция выполняется с помощью функции Python union () .

Вот пример:

months_a = set(["Jan", "Feb", "March", "Apr", "May", "June"])
months_b = set(["July", "Aug", "Sep", "Oct", "Nov", "Dec"])

all_months = months_a.union(months_b)
print(all_months)

Выход

{'Oct', 'Jan', 'Nov', 'May', 'Aug', 'Feb', 'Sep', 'March', 'Apr', 'Dec', 'June', 'July'}

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

x = {1, 2, 3}
y = {4, 5, 6}
z = {7, 8, 9}

output = x.union(y, z)

print(output)

Выход

{1, 2, 3, 4, 5, 6, 7, 8, 9}

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

x = {1, 2, 3}
y = {4, 3, 6}
z = {7, 4, 9}

output = x.union(y, z)

print(output)

Выход

{1, 2, 3, 4, 6, 7, 9}

Оператор | также может быть использован для нахождения объединения двух или более множеств. Например:

months_a = set(["Jan","Feb", "March", "Apr", "May", "June"])
months_b = set(["July", "Aug", "Sep", "Oct", "Nov", "Dec"])

print(months_a | months_b)

Выход

{'Feb', 'Apr', 'Sep', 'Dec', 'Nov', 'June', 'May', 'Oct', 'Jan', 'July', 'March', 'Aug'}

Если вы хотите выполнить объединение более чем двух наборов, разделите имена наборов с помощью оператора /. Например:

x = {1, 2, 3}
y = {4, 3, 6}
z = {7, 4, 9}

print(x | y | z)

Выход

{1, 2, 3, 4, 6, 7, 9}

Установить Пересечение

Предположим, у вас есть два множества A и B. Их пересечение-это множество с элементами, которые являются общими как в A, так и В B.

Операция пересечения в множествах может быть достигнута либо с помощью оператора & , либо с помощью метода intersection () . Например:

Например:

x = {1, 2, 3}
y = {4, 3, 6}

print(x & y)

Выход

{3}

Эти два набора имеют 3 в качестве общего элемента. То же самое можно сделать и с помощью метода intersection() :

x = {1, 2, 3}
y = {4, 3, 6}

z = x.intersection(y)
print(z)

Выход

{3}

В следующем разделе мы обсудим, как определить разницу между наборами.

Установить Разницу

Предположим, у вас есть два набора A и B. Различие A и B (A – B) – это множество со всеми элементами, которые находятся в A, но не в B. Следовательно, (B-A) – это множество со всеми элементами в B, но не в A.

Чтобы определить различия наборов в Python, мы можем использовать либо функцию difference () , либо оператор - . Например:

set_a = {1, 2, 3, 4, 5}
set_b = {4, 5, 6, 7, 8}
diff_set = set_a.difference(set_b)
print(diff_set)

Выход

{1, 2, 3}

в приведенном выше скрипте только первые три элемента set set_a недоступны в set set_b , следовательно , они формируют наш вывод. Оператор минус - также может быть использован для нахождения разницы между двумя наборами, как показано ниже:

set_a = {1, 2, 3, 4, 5}
set_b = {4, 5, 6, 7, 8}
print(set_a - set_b)

Выход

{1, 2, 3}

Симметричная разность множеств A и B-это множество со всеми элементами, находящимися в A и B, за исключением элементов, общих в обоих множествах. Он определяется с помощью метода symmetric_difference() Python или оператора ^ . Например:

set_a = {1, 2, 3, 4, 5}
set_b = {4, 5, 6, 7, 8}
symm_diff = set_a.symmetric_difference(set_b)
print(symm_diff)

Выход

{1, 2, 3, 6, 7, 8}

Симметричная разность также может быть найдена следующим образом:

set_a = {1, 2, 3, 4, 5}
set_b = {4, 5, 6, 7, 8}
print(set_a ^ set_b)

Выход

{1, 2, 3, 6, 7, 8}

Сравнение наборов

Мы можем сравнивать наборы в зависимости от элементов, которые они имеют. Таким образом, мы можем сказать, является ли набор надмножеством или подмножеством другого набора. Результатом такого сравнения будет либо True , либо False .

Чтобы проверить, является ли множество A подмножеством множества B, мы можем использовать следующую операцию:

A <= B

Чтобы проверить, является ли B надмножеством A, мы можем использовать следующую операцию:

B >= A

Например:

months_a = set(["Jan", "Feb", "March", "Apr", "May", "June"])
months_b = set(["Jan", "Feb", "March", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"])

subset_check = months_a <= months_b
superset_check = months_b >= months_a

print(subset_check)
print(superset_check)

Выход

True
True

Подмножество и надмножество также можно проверить с помощью методов issubset() и issuperset () , как показано ниже:

months_a = set(["Jan","Feb", "March", "Apr", "May", "June"])
months_b = set(["Jan","Feb", "March", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"])

subset_check = months_a.issubset(months_b)
superset_check = months_b.issuperset(months_a)

print(subset_check)
print(superset_check)

Выход

True
True

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

Методы Набора

Python поставляется с многочисленными встроенными методами набора, включая следующие:

Python поставляется с многочисленными встроенными методами набора, включая следующие:

копировать()

string_set = {"Nicholas", "Michelle", "John", "Mercy"}
x = string_set.copy()

print(x)

Этот метод возвращает копию рассматриваемого набора. Например:

{'John', 'Michelle', 'Nicholas', 'Mercy'}

Вывод показывает, что x является копией набора string_set .

isdisjoint()

Этот метод проверяет, имеют ли рассматриваемые множества пересечение или нет. Если наборы не имеют общих элементов, этот метод возвращает True , в противном случае он возвращает False . Например:

names_a = {"Nicholas", "Michelle", "John", "Mercy"}
names_b = {"Jeff", "Bosco", "Teddy", "Milly"}

x = names_a.isdisjoint(names_b)
print(x)

Выход

True

Эти два набора не имеют общих элементов, поэтому вывод будет True .

лен()

Этот метод возвращает длину набора, которая представляет собой общее количество элементов в наборе. Например:

names_a = {"Nicholas", "Michelle", "John", "Mercy"}

print(len(names_a))

Этот метод возвращает длину набора, которая представляет собой общее количество элементов в наборе. Например:

4

Вывод показывает, что набор имеет длину 4.

Вывод показывает, что набор имеет длину 4.

Frozenset-это класс с характеристиками набора, но после того, как его элементы были назначены, они не могут быть изменены. Кортежи можно рассматривать как неизменяемые списки, а замороженные наборы-как неизменяемые наборы.

Наборы являются изменяемыми и неэшируемыми, что означает, что мы не можем использовать их в качестве словаря

Для создания frozenset мы используем метод frozenset () . Давайте создадим два frozensets, X и Y :

X = frozenset([1, 2, 3, 4, 5, 6])
Y = frozenset([4, 5, 6, 7, 8, 9])

print(X)
print(Y)

Выход

frozenset({1, 2, 3, 4, 5, 6})
frozenset({4, 5, 6, 7, 8, 9})

Frozensets поддерживают использование методов набора Python, таких как copy() , difference() , symmetric_difference() , is disjoint() , issubset() , intersection() , issuperset () и union() .

Вывод

В статье дается подробное введение в наборы в Python. Математическое определение множеств совпадает с определением множеств в Python. Набор – это просто набор неупорядоченных элементов. Само множество изменчиво, но элементы множества неизменны. Однако мы можем свободно добавлять и удалять элементы из набора. В большинстве структур данных элементы индексируются. Однако элементы набора не индексируются. Это делает невозможным выполнение операций, нацеленных на определенные элементы набора.