Теория множеств в Python: свойства, операции и методы

Часто в нашей жизни можно услышать расплывчатое выражение «Множество». Математики используют его для определения некоторой последовательности чисел, но вот в русском языке это слово имеет совсем другой смысл.

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

В языках программирования, например, в Рython, существует даже целый тип данных c таким названием. Рассмотрим, что же программисты имеют ввиду под этим загадочным словом.

Что такое множество?

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

Если обратиться к математике, то этим называют любую последовательность каких-либо объектов. Например, последовательность простых чисел: 1, 2, 3, 5, 7 и так далее, либо положительных чисел: (1,2,3,4,5,6…), ну или последовательность положительных чисел кроме пяти: (1,2,3,4,6…).

Вот, заострите внимание на последнем примере, в нем появляется условие «кроме». По сути, в базовом курсе математики единственные операции, которые проходят обучающиеся, это указания вхождения определенных значений.

В курсе высшей математики это понятие расширяется, но, впрочем, не будем пугать вас таким страшным выражением, как «высшая математика», а поскорее перейдем от нее к программированию.

В программировании – это тоже последовательность каких-либо значений, но только простых. То есть, туда можно поместить целые числа, числа с плавающей точкой, символы, строки и даже логические значения. Однако, списки и словари внутрь поместить не получится – вернется ошибка TypeError.

Теория множеств в Python: свойства, операции и методы
Структурные типы данных нельзя помещать внутрь set

Если читатель хотя бы поверхностно знаком с языком, то заявит: «Подождите, а разве для этой задачи не используется ли список, ну или словарь на крайний случай». Вы правы, под определение выше подходит и list, и set.

Однако, у последних есть две отличительные особенности:

  • Все значения внутри уникальны. То есть, если в списке будет такая последовательность: [2,4,4,7,2], то на выходе (например, выводе в консоль) программист и получит все 5 чисел. Попробуем закинуть эту же последовательность в set. На выходе останется только три элемента: 2, 4, 7, их дубликаты были удалены.
  • Они заточены под сравнения. Для них существует целая стопка функций для сравнений.

И на этом, по сути все.

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

Как создать множество

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

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

Пример в действии:

seter = set() # создаем переменную типа set
print(type(seter)) # выводим его тип, set
print(len(seter)) # выводим его размер, 0

На выходе мы получим ответ, состоящий из двух строк: типа объекта (как мы знаем, в Python даже обычная переменная – это объект) и его размера.

Теория множеств в Python: свойства, операции и методы
Вывод свойств пустой переменной

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

Пример:

with_value = {1,4,6,4}
print(type(with_value), len(with_value), sep="\n") # 

Немного сократили код, теперь одна команда выводит две строчки.

Теперь у нас есть последовательность с четырьмя значениями. Запускаем программу и…

Теория множеств в Python: свойства, операции и методы
Результат выполнения программы

При выполнении функция len вернула результат 3. Но ведь она считает размер, что пошло не так?

Присмотритесь к значениям, которые перечислены внутри фигурных скобок. Там дважды повторяется элемент «4». Так вот, python неявно для разработчика сразу урезал вторую четверку.

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

Заменяем дубликат на другую цифру и проверяем снова. На выходе функция len теперь вернет значение 4. И третий случай инициализации – это перевод из другого типа данных.

Чтобы сделать это, нужно просто поместить переменную с другим типом данных в функцию set().

Пример такой ситуации:

b = 's'
c = "Hello"
d = [4,1,3,4,2]
b = set(b)
c = set(c)
d = set(d)
print(b, c, d, sep="\n")

С помощью set мы преобразовали другие типы, а после вывели все это.

В консоли это выглядит так:

Теория множеств в Python: свойства, операции и методы
Преобразования – это, пожалуй, одна из самых частых операций, проводимая с множествами

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

В python существуют и так называемые «замороженные» – frozenset. В русскоязычном сегменте практически никто не использует слово «замороженные», хоть оно отлично подходит, да и переводится также.

Так вот, frozenset, в отличие от set, неизменяем. То есть его можно читать и обрабатывать как обычную переменную, а вот добавлять новые и корректировать существующие значения не получится.

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

Практический пример:

x = [8,4,6,2]
x = frozenset(x)
print(type(x)) # frozenset

Frozenset – это неизменяемые множества.

Как работать с множествами в Python?

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

Ради интереса попробуйте скопировать и выполнить этот код:

seter = {4,2,6,3}
print(seter[0]) # TypeError
seter += 5 # TypeError
print(seter)

Оба выражения приводят к ошибке типа.

Рассмотрим по порядку, почему не удалось обратиться к отдельному элементу.

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

seter = {4,2,6,3}
set_to_list = list(seter)
print(set_to_list[0]) # 2

Почему же в таком случае выводится 2, а не 4? Это еще одна особенность этого типа данных – он неявно сортирует значения в порядке возрастания. Однако преобразование прошло успешно и отдельных элемент был выведен.

Второй способ – это перебор через цикл for:

seter = {4,2,6,3}
for i in seter:
	print(i)

Результат:

Теория множеств в Python: свойства, операции и методы
Результат выполнения программы

По сути, обращаться к отдельным элементам приходится довольно редко.

Добавление нескольких элементов в множество Python

А вот добавить новые элементы – это вполне легальная операция, но только выполняется она не через стандартный оператор сложения.

Для добавления одного нового элемента используется функция add. Она принимает только один аргумент, причем он должен быть простым, а не структурным.

Реализуем такой код:

j = {1,3,5}
j.add(6) # добавить элемент 6
j.add(4) # добавить элемент 4
print(j)

В итоге переменная пополнилась на два значения.

Теория множеств в Python: свойства, операции и методы
Добавление новых элементов

Однако, как добавить сразу несколько значений. В таком случае необходимо заранее подготовить еще список, в котором указать новые значения. После используйте функцию update для склеивания двух переменных.

Выглядит это примерно так:

j = {1,3,5}
k = [7,9,11]
j.update(k) # к j добавили значения из списка k
print(j)

Тут и без скриншота понятно – программа склеит две переменные в одну, а после отсортирует их.

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

Теория множеств в Python: свойства, операции и методы

Удаление элементов из множеств Python

Теперь, когда наша переменная изобилует значениями, некоторые из них можно удалить.

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

Реализация:

j = {1,3,5}
k = [7,9,11]
j.update(k)
print(j.pop())
print(j.pop())
print(j.pop())
print(j)
Теория множеств в Python: свойства, операции и методы
Удаление первого элемента с помощью метода pop

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

В множестве нельзя искать по индексу, а только по значению.

Чтобы удалить элемент по значению, можно использовать функции remove и discard. Разница между ними в том, что первая функция возвращает ошибку KeyError при указании несуществующего ключа, а discard ничего в таком случае не делает.

Проверим сразу два метода:

j = {1,3,5}
k = [7,9,11]
j.update(k)
print(j.remove(7)) # удаляем существующий элемент
print(j.discard(1)) # тоже самое, но с другой функцией
print(j.discard(12)) # Удаляем несуществующий элемент 
print(j.remove(12)) # тоже самое, но с другой функцией
print(j)
Теория множеств в Python: свойства, операции и методы
Удаление элементов по значению

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

Методы множеств

Теперь о том, зачем они вообще нужны. Мы говорили, что одно из преимуществ – это наличие встроенных функций, позволяющих сравнивать два и более множеств.

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

Нам доступны следующие операции с множествами в python:

  • isdisjoint — сравнивает, если нет общих элементов, то возвращается истина. Пример: k.isdisjoint(y) – проверка, есть ли общие элементы у k и y;
  • issubset — проверяет, входят ли все элементы первого множества (до точки) во второе (в скобках);
  • intersection — находит общие элементы, а после возвращает их в отдельную переменную;
  • difference — выводит все элементы, которых нет в остальных;
  • union — объединеняет элементы.

С более подробным перечислением программист может ознакомиться в официальной документации языка.

Чтобы воспользоваться любой из перечисленных функций, необходимо указать имя основной переменной, через точку выбрать метод, а в скобках через запятую указать сравниваемые значения.

Пример с пересечением множеств в python:

test = {1,2,3}
other= {3,4,5}

x = test.intersection(other)
print(x)

В качестве результата вернется {3}.

Теория множеств в Python: свойства, операции и методы
Множества пересекаются разными способами

Свойства множеств

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

  1. Уникальность элементов. Все значения встречаются только один раз.
  2. Непорядочность. У элементов нет порядкового номера (индекса).
  3. Функции сравнения. Множества легко сравнивать и накладывать друг на друга
  4. Возможность перебора. Несмотря на отсутствия индекса, перебрать множество можно через for.

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

Вывод

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

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

Есть три ученика средней школы. Они заполняли одну и ту же анкету на днях. Необходимо проанализировать ответы на анкету и выбрать, какие ответы совпали у всех трех учеников.

Удачи в решении!

Данияр Абикенов Программист, самостоятельно выучил Python с нуля

Оцените статью
Айтистанция
Добавить комментарий

Adblock
detector