Python Set union() – Полное руководство за 5 минут
Python Set union() - Полное руководство за 5 минут' - Практическое руководство по методу union() в Python за 5 минут
У программистов Python есть несколько способов объединить два набора в один. В этом блог-посте мы рассмотрим метод union()
для наборов, а также рассмотрим примеры использования. Мы также обсудим некоторые преимущества использования метода union()
и посмотрим, почему это популярный инструмент для разработчиков Python.
Наконец, мы рассмотрим некоторые сложные случаи использования и изучим эффективность метода union()
. Итак, приступим!
Объединение наборов в Python – основы
В этом разделе мы рассмотрим основное определение и использование метода union()
для наборов в Python, исследуем его синтаксис и возвращаемое значение.
- MakeBlobs + Fictional Synthetic Data – новое (но не совсем) применение
- Один шаг, чтобы деревья принятия решений давали лучшие результаты
- Раскрываем секреты функции Log-Loss
Определение и использование метода union()
для наборов в Python
Прежде чем перейти к примерам, давайте начнем с основ. Что такое метод union()
? Как и ожидалось, это функция, которая объединяет два набора в один. Функция может объединить один набор с несколькими другими наборами или итерируемыми объектами Python.
Например, посмотрите на следующие два набора – A и B:
![Изображение 1 - Объединение наборов в Python - два набора (изображение автора)](https://ai.miximages.com/betterdatascience.com/python-set-union/images/1.jpg)
Изображение 1 – Объединение наборов в Python – два набора (изображение автора)
Вычисление объединения этих наборов означает создание нового набора, в котором есть все уникальные элементы из обоих наборов:
![Изображение 2 - Объединение наборов в Python - объединение двух наборов (изображение автора)](https://ai.miximages.com/betterdatascience.com/python-set-union/images/2.jpg)
Изображение 2 – Объединение наборов в Python – объединение двух наборов (изображение автора)
Обычно объединение наборов в Python представляется диаграммой Венна. Вот как это выглядит:
![Изображение 3 - Объединение наборов в Python как диаграмма Венна (изображение автора)](https://ai.miximages.com/betterdatascience.com/python-set-union/images/3.jpg)
Изображение 3 – Объединение наборов в Python как диаграмма Венна (изображение автора)
В левом наборе присутствуют элементы R и Julia, которых нет в правом наборе. Аналогично, в правом наборе есть отдельные элементы JavaScript и Go. Есть один общий элемент для обоих наборов – Python.
Имейте в виду: Если элемент присутствует в нескольких наборах, он будет перечислен только один раз в полученном наборе.
Синтаксис объединения наборов в Python
# Объединение двух наборовset1.union(set2)# Объединение нескольких наборовset1.union(set2, set3, ...)
Где:
set1
– Итерируемый объект для объединения.set2
,set3
– Дополнительный(ые) набор(ы), другие итерируемые объекты для объединения.
Значение, возвращаемое методом объединения наборов в 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)](https://ai.miximages.com/betterdatascience.com/python-set-union/images/4.png)
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)](https://ai.miximages.com/betterdatascience.com/python-set-union/images/5.png)
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 (изображение автора)](https://ai.miximages.com/betterdatascience.com/python-set-union/images/6.jpg)
Изображение 6 – график времени выполнения объединения множеств в Python (изображение автора)
Заключение
Python set union прост в понимании. Мы прошлись по определению и интуиции, понемногу продвигаясь в понимании более сложных случаев использования. Вы должны признать – даже продвинутый раздел был легким для усвоения.
Статья оригинально опубликована здесь. Перепост с разрешения.