Множества в Python

  1. Создание множеств
  2. Пустые множества
  3. Встроенная функция set()
  4. Вывод множеств

Аннотация. Начинаем изучение множеств в Python (тип данных set). Этот тип данных аналогичен математическим множествам, он поддерживает быстрые операции проверки наличия элемента в множестве, добавления и удаления элементов, операции объединения, пересечения и многие другие.

Множества

В прошлых уроках мы изучили три типа коллекций в Python:

Следующий тип коллекций (наборов данных) – множество.

Множество – структура данных, организованная так же, как математические множества.

Важно знать:

Структура данных (data structure) — программная единица, позволяющая хранить и обрабатывать множество однотипных и/или логически связанных данных.

Создание множества

Чтобы создать множество, нужно перечислить его элементы через запятую в фигурных скобках:

numbers = {2, 4, 6, 8, 10}
languages = {"Python", "C#", "C++", "Java"}

Множество numbers состоит из 5 элементов, и каждый из них — целое число.

Множество languages состоит из 4 элементов, каждый из которых — строка**.**

Множества могут содержать значения разных типов данных:

info = {'Timur', 1992, 61.5}

Множество info содержит строковое значение, целое число и число с плавающей точкой.

Не создавайте переменные с именем set. Это очень плохая практика.

Пустое множество

Создать пустое множество можно с помощью встроенной функции, которая называется set():

myset = set()  # пустое множество

Обратите внимание — создать пустое множество с помощью пустых фигурных скобок нельзя:

myset = {}  # создается словарь

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

Пустое множество создаётся исключительно через set().

Вывод множества

Для вывода всего множества можно использовать функцию print():

numbers = {2, 4, 6, 8, 10}
languages = {"Python", "C#", "C++", "Java"}
mammals = {"cat", "dog", "fox", "elephant"}

print(numbers)
print(languages)
print(mammals)

Функция print() выводит на экран элементы множества в фигурных скобках, разделенные запятыми:

{2, 4, 6, 8, 10}
{"C#", "Python", "Java", "C++"}
{"dog", "cat", "fox", "elephant"}

Обратите внимание: при выводе множества порядок элементов может отличаться от существовавшего при его создании, поскольку множества — неупорядоченные коллекции данных.

Встроенная функция set()

Встроенная функция set() помимо создания пустого множества может преобразовывать некоторые типы объектов в множества.

В функцию set() можно передать один аргумент. Передаваемый аргумент должен быть итерируемым объектом, таким как список, кортеж или строковое значение. Отдельные элементы объекта, передаваемого в качестве аргумента, становятся элементами множества:

myset1 = set(range(10))          # множество из элементов последовательности
myset2 = set([1, 2, 3, 4, 5])    # множество из элементов списка
myset3 = set('abcd')             # множество из элементов строки
myset4 = set((10, 20, 30, 40))   # множество из элементов кортежа

Пустое множество также можно создать передав функции set() в качестве аргумента пустой список, строку или кортеж:

emptyset1 = set([])  # пустое множество из пустого списка
emptyset2 = set('')  # пустое множество из пустой строки
emptyset3 = set(())  # пустое множество из пустого кортежа

Дубликаты при создании множеств

Множества не могут содержать повторяющиеся элементы. Если в функцию set() передать аргумент, содержащий повторяющиеся элементы, то в множестве появится только один из этих повторяющихся элементов.

Приведенный ниже код:

myset1 = {2, 2, 4, 6, 6}
myset2 = set([1, 2, 2, 3, 3])
myset3 = set("aaaaabbbbccccddd")

print(myset1)
print(myset2)
print(myset3)

выводит (порядок элементов может отличаться):

{2, 4, 6}
{1, 2, 3}
{"b", "c", "d", "a"}

Если требуется создать множество, в котором каждый элемент — строковое значение, содержащее более одного символа, то используем код:

myset = set(['aaa', 'bbbb', 'cc'])

print(myset)

Приведенный выше код выводит (порядок элементов может отличаться):

{'bbbb', 'aaa', 'cc'}

Если же создать множество следующим образом:

myset = set('aaa bbbb cc')

print(myset)

то мы получим (порядок элементов может отличаться):

{' ', 'c', 'a', 'b'}

Обратите внимание на наличие пробела в качестве элемента множества myset.

Примечания

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

Приведенный ниже код:

myset1 = {1, 2, [5, 6], 7}  # множество не может содержать список
myset2 = {1, 2, {5, 6}, 7}  # множество не может содержать множество

приводит к ошибке:

TypeError: unhashable type: 'list'
TypeError: unhashable type: 'set'

Однако приведенный ниже код:

myset = {1, 2, (5, 6), 7}  # множество может содержать кортеж

работает, как полагается.

Примечание 2. Отличная статья с хабра про множества.