Генераторы множеств в Python

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

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

В этой статье:

  1. Что такое генераторы множеств в Python?
  2. Синтаксис генераторов множеств в Python
  3. Примеры использования генераторов 
    1. Создание множества из элементов другого множества
    2. Фильтрация элементов из множества по условию
    3. Удаление элементов из множества
    4. Изменение типа данных элементов множества
  4. Заключение

Что ж, давайте приступать!

Что такое генераторы множеств в Python?

Генератор множества (англ. set comprehension) — это метод создания множеств с использованием элементов из других итерируемых объектов, таких как списки, другие множества или кортежи. Точно так же, как мы используем генераторы списков для создания списков, мы можем использовать генераторы множеств вместо цикла for для создания нового множества и добавления в него элементов.

Синтаксис генераторов множеств в Python

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

newSet = {expression for element in  iterable}

Разбор синтаксиса:

  • iterable может быть любым итерируемым объектом, элементы которого мы можем использовать для создания нового множества
  • element — элемент итерируемого объекта, который должен быть включен в набор
  • expression может быть любым математическим выражением, применяемым к element
  • newSet — это имя нового множества, которое должно быть создано из элементов итерируемого объекта iterable.

Давайте подробнее разберем этот синтаксис на примере. Допустим, у нас есть список из 10 целых чисел. Нам нужно создать на его основе множество чисел, где каждое число будет образовано умножением числа из списка на 3. То есть первое значение во множестве будет 1 * 3 = 3, второе — 6, потом 9 и так далее.

Это можно сделать с помощью генератора множеств:

myList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
newSet = {element*3 for element in myList}
print("Имеющийся список:")
print(myList)
print("Созданное множество:")
print(newSet)

Результат работы кода: 

Имеющийся список:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Созданное множество:
{3, 6, 9, 12, 15, 18, 21, 24, 27, 30}

Здесь мы взяли список из 10 целых чисел и на его основе создали множество. В множество вошли элементы списка, умноженные на 3.

В строке newSet = {element *3 for element in myList} для создания множества из исходного списка myList используется генератор множества.

Если вы сравните данный код с общим синтаксисом генераторов множеств, о котором мы говорили выше, то можно сделать следующее наблюдения:

  1. myList — это список, элементы которого использовались для создания нового множества. Следовательно, myList использовался в качестве итерируемого объекта — iterable.
  2. Мы создали множество из утроенных значений элементов списка myList. Следовательно, в качестве выражения expression используется выражение element*3.
[python_ad_block]

Использование условных операторов в генераторах множеств

В генераторах множеств можно использовать условия. Синтаксис set comprehension c условными операторами в генераторах будет следующим:

newSet= {expression for element in iterable if condition}

Разбор синтаксиса:

  • iterable — любой итерируемый объект, элементы которого используются для создания нового множества
  • condition — условное выражение, которое применяется к элементу element, чтобы проверить, подходит ли он
  • element — элемент итерируемого объекта, который должен быть включен во множество
  • expression может быть любым математическим выражением, применяемым к element
  • newSet — это имя нового множества, которое должно быть создано из элементов итерируемого объекта.

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

myList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
newSet = {element*3 for element in myList if element % 2 ==0}
print("Имеющийся список:")
print(myList)
print("Созданное множество:")
print(newSet)

Запустив данный код, мы получим следующее:

Имеющийся список:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Созданное множество:
{6, 12, 18, 24, 30}

В строке newSet = {element *3 for element in myList if element % 2 == 0} для создания множества из утроенных значений четных чисел из списка myList использован генератор множества.

Сравним наш код с базовым синтаксисом генераторов:

  1. myList — это список, элементы которого использовались для создания нового множества. Следовательно, myList использовался как итерируемый объект (iterable), как и в прошлом примере.
  2. Мы должны были создать новое множество с утроенными значениями четных элементов myList. Следовательно, в качестве выражения (expression) используется значение element*3.
  3. Чтобы выбрать только четные элементы, мы использовали условный оператор if и выражение element % 2 == 0 в качестве условия.

Примеры использования генераторов множеств

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

Создание множества из элементов другого множества

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

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

mySet = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
newSet = set()
for element in mySet:
   newSet.add(element**2)
print("Исходное множество:")
print(mySet)
print("Новое множество:")
print(newSet)

Запустим наш код и получим следующий результат:

Исходное множество:
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
Новое множество:
{64, 1, 4, 36, 100, 9, 16, 49, 81, 25}

Однако в приведенном выше примере инициализация пустого множества с последующим использованием метода add() для добавления в него элементов неэффективна. Вместо этого мы можем напрямую инициализировать новое множество со всеми элементами, используя генератор множеств! И сделать это можно следующим образом:

mySet = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
newSet = {element ** 2 for element in mySet}
print("Исходное множество:")
print(mySet)
print("Новое множество:")
print(newSet)

В результате работы нашей программы мы должны получить следующее:

Исходное множество:
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
Новое множество:
{64, 1, 4, 36, 100, 9, 16, 49, 81, 25}

Фильтрация элементов множества по условию

Кроме того, мы можем создать новое множество из элементов старого, применяя к элементам некоторые условия. Чтобы сделать это с помощью цикла for, вы можете использовать условный оператор if и метод add(). В следующем примере мы отфильтровали множество так, чтобы там остались только четные числа:

mySet = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
newSet = set()
for element in mySet:
    if element % 2 == 0:
        newSet.add(element)
print("Исходное множество:")
print(mySet)
print("Новое множество:")
print(newSet)

И вот такой результат у нас получился:

Исходное множество:
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
Новое множество:
{2, 4, 6, 8, 10}

Но отфильтровать элементы можно не в цикле for, а сразу в генераторе множества:

mySet = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
newSet = {element for element in mySet if element % 2 == 0}
print("Исходное множество:")
print(mySet)
print("Новое множество:")
print(newSet)

Запустим наш код и получим точно такой же результат, только в этот раз наш код намного более эффективен!

Исходное множество:
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
Новое множество:
{2, 4, 6, 8, 10}

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

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

mySet = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
print("Исходное множество:")
print(mySet)
mySet = {element for element in mySet if element % 2 == 0}
print("Измененное множество:")
print(mySet)

Запустим наш код и получим желаемый результат:

Исходное множество:
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
Измененное множество:
{2, 4, 6, 8, 10}

Изменение типа данных элементов множества

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

mySet = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
newSet = {str(element) for element in mySet }
print("Исходное множество:")
print(mySet)
print("Новое множество:")
print(newSet)

Запустим код и получим следующий результат:

Исходное множество:
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
Новое множество:
{'2', '4', '8', '6', '3', '7', '1', '10', '5', '9'}

Заключение

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

Надеемся, данная статья была вам полезна! Успехов в написании кода!

Перевод статьи «Set Comprehension in Python».