Python Set union() – Полное руководство за 5 минут

Python Set union() - Полное руководство за 5 минут' - Практическое руководство по методу union() в Python за 5 минут

У программистов Python есть несколько способов объединить два набора в один. В этом блог-посте мы рассмотрим метод union() для наборов, а также рассмотрим примеры использования. Мы также обсудим некоторые преимущества использования метода union() и посмотрим, почему это популярный инструмент для разработчиков Python.

Наконец, мы рассмотрим некоторые сложные случаи использования и изучим эффективность метода union(). Итак, приступим!

Объединение наборов в Python – основы

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

Определение и использование метода union() для наборов в Python

Прежде чем перейти к примерам, давайте начнем с основ. Что такое метод union()? Как и ожидалось, это функция, которая объединяет два набора в один. Функция может объединить один набор с несколькими другими наборами или итерируемыми объектами Python.

Например, посмотрите на следующие два набора – A и B:

Изображение 1 - Объединение наборов в Python - два набора (изображение автора)

Изображение 1 – Объединение наборов в Python – два набора (изображение автора)

Вычисление объединения этих наборов означает создание нового набора, в котором есть все уникальные элементы из обоих наборов:

Изображение 2 - Объединение наборов в Python - объединение двух наборов (изображение автора)

Изображение 2 – Объединение наборов в Python – объединение двух наборов (изображение автора)

Обычно объединение наборов в Python представляется диаграммой Венна. Вот как это выглядит:

Изображение 3 - Объединение наборов в Python как диаграмма Венна (изображение автора)

Изображение 3 – Объединение наборов в Python как диаграмма Венна (изображение автора)

В левом наборе присутствуют элементы R и Julia, которых нет в правом наборе. Аналогично, в правом наборе есть отдельные элементы JavaScript и Go. Есть один общий элемент для обоих наборов – Python.

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

Синтаксис объединения наборов в Python

# Объединение двух наборовset1.union(set2)# Объединение нескольких наборовset1.union(set2, set3, ...)

Где:

  • set1 – Итерируемый объект для объединения.
  • set2set3 – Дополнительный(ые) набор(ы), другие итерируемые объекты для объединения.

Значение, возвращаемое методом объединения наборов в Python

Метод union() возвращает новый набор, который является объединением всех наборов с первым – только если набор(ы) или итерируемый(ые) объект(ы) были переданы в метод union().

Если в метод union() не были переданы аргументы, возвращается копия набора.

Пример метода объединения наборов в Python

Мы объявим два набора, как на изображениях выше:

  • A – содержит языки программирования, используемые в науке о данных
  • B – содержит языки программирования, используемые в веб-разработке

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

A = {'Python', 'R', 'Julia'}B = {'Python', 'JavaScript', 'Go'}print(f"A U B = {A.union(B)}")

Вывод:

A U B = {'Go', 'Python', 'JavaScript', 'R', 'Julia'}

Если вы не указываете никаких параметров для функции union() в Python, набор копируется:

print(f"A.union() = {A.union()}")

Вывод:

A.union() = {'R', 'Julia', 'Python'}

Вы можете проверить, что он был скопирован, печатая его адрес памяти:

A = {'Python', 'R', 'Julia'}A_copy = A.union()print(hex(id(A)))print(hex(id(A_copy)))

Вывод:

0x105a03e400x105a039e0

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

Теперь давайте рассмотрим более короткий способ получения объединения нескольких наборов.

Объединение наборов в Python с использованием оператора |

Нет необходимости вызывать функцию union() для набора в Python каждый раз. Вместо этого вы можете использовать оператор “палка” (|):

A = {'Python', 'R', 'Julia'}B = {'Python', 'JavaScript', 'Go'}print(f"A U B = {A | B}")

Вывод:

A U B = {'Go', 'Python', 'JavaScript', 'R', 'Julia'}

Все остальное остается тем же. Этот подход более компактный и читаемый, чем первый, по крайней мере, если вы объединяете два набора.

Продвинутые примеры объединения наборов в Python

Теперь мы рассмотрим несколько “продвинутых” примеров и случаев использования объединения:

  • Несколько аргументов наборов
  • Обновление набора против объединения наборов
  • Объединение в Python с использованием итерируемых объектов

Несколько аргументов наборов

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

Расчет работает как с обычным синтаксисом, так и с кратким синтаксисом “палки”:

A = {'Python', 'R', 'Julia'}B = {'Python', 'JavaScript', 'Go'}C = {'R', 'Matlab', 'Octave'}print(f"A U B U C = {A.union(B, C)}")print(f"A U B U C = {A | B | C}")

Вывод:

A U B U C = {'Octave', 'Go', 'Python', 'JavaScript', 'Matlab', 'R', 'Julia'}A U B U C = {'Octave', 'Go', 'Python', 'JavaScript', 'Matlab', 'R', 'Julia'}

Обновление набора против объединения наборов

Вы можете выполнять операцию объединения в Python как с использованием set.update(), так и с использованием set.union(). Первый добавляет все недостающие элементы в набор, в котором он вызывается, и возвращает None, в то время как второй создает и возвращает новый набор.

Вот как работает set.update():

A = {'Python', 'R', 'Julia'}B = {'Python', 'JavaScript', 'Go'}A.update(B)print(A)

Вывод:

{'Go', 'Python', 'JavaScript', 'R', 'Julia'}

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

A = {'Python', 'R', 'Julia'}
B = {'Python', 'JavaScript', 'Go'}
C = A.update(B)
print(C)

Вывод:

None

Объединение множеств в Python с помощью итерируемых объектов

Вы можете вызвать функцию union() на множестве в Python и передать любой итерируемый объект в качестве аргумента – вот пример для списка Python:

l1 = {1, 2, 3}
l2 = [2, 3, 4]
print(l1.union(l2))

Вывод:

{1, 2, 3, 4}

Имейте в виду: Вы не можете использовать короткий оператор “pipe” (|):

l1 = {1, 2, 3}
l2 = [2, 3, 4]
print(l1 | l2)

Вывод:

Image 4 - TypeError when trying to union Python set and list (image by author)

Image 4 – TypeError при попытке объединить множество Python и список (изображение автора)

Также нельзя использовать что-либо, кроме множества Python в качестве первого элемента – поскольку ни в одном другом типе данных нет функции union():

l1 = [1, 2, 3]
l2 = [2, 3, 4]
print(l1.union(l2))

Вывод:

Image 5 - AttributeError when trying to call union() on a Python list (image by author)

Image 5 – AttributeError при попытке вызвать union() на списке Python (изображение автора)

Короче говоря – Вам всегда нужно использовать функцию union() вместо оператора “pipe”, и вы должны вызывать функцию на множестве.

Производительность объединения множеств в Python (Временная сложность)

Теперь мы проанализируем временную сложность операции объединения множества в Python. Я нашел исходный код на блоге Finxter и слегка его модифицировал. Вкратце:

  • Временная сложность для множества с n элементами и аргументами множества с m элементами составляет O(n + m).
  • Вставка элемента в множество имеет сложность O(1).

Вот код на Python, который вычисляет и отображает график размера множества по оси X и времени выполнения в секундах по оси Y. Я запустил этот код на M1 Pro MacBook Pro 16″:

import time
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (12, 5)
plt.rcParams['axes.spines.top'] = False
plt.rcParams['axes.spines.right'] = False

# Вычисления
sizes = [i * 10**5 for i in range(100)]
runtimes = []

for size in sizes:
    s = set(range(size))
    t = set(range(0, size, 2))
    
    t1 = time.time()
    s.union(t)
    t2 = time.time()
    
    runtimes.append(t2 - t1)

# График
plt.figure()
plt.plot(sizes, runtimes, lw=3, color='#101010')
plt.title('Время выполнения функции union() в зависимости от размера множества', size=20)
plt.xlabel('Размер множества', size=14)
plt.ylabel('Время выполнения (сек)', size=14);

Вывод:

Изображение 6 - график времени выполнения объединения множеств в Python (изображение автора)

Изображение 6 – график времени выполнения объединения множеств в Python (изображение автора)


Заключение

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

Статья оригинально опубликована здесь. Перепост с разрешения.