Python程序员有几种将两个集合合并为一个的方法。在这篇博文中,我们将探讨set的union()
方法,并举例说明如何使用它。我们还将讨论使用set union()
的一些好处,并看看为什么它是Python开发者常用的工具。
最后,我们将介绍一些高级用例,并检查set union()
的效率。让我们开始吧!
Python集合并集 – 基础知识
在本节中,我们将介绍在Python中使用set的union()
函数的基本定义和用法,探索其语法和返回值。
set并集在Python中的定义和用法
在我们进入一些示例之前,让我们从基础知识开始。什么是set的union()
?正如你所期望的,它是将两个集合合并为一个的函数。该函数可以将一个集合与多个其他集合或Python可迭代对象合并。
例如,看一下以下两个集合 – A和B:
![Python集合union() - 5分钟完全指南 四海 第2张-四海吧 图片1 - Python集合并集 - 两个集合(图像作者)](https://ai.miximages.com/betterdatascience.com/python-set-union/images/1.jpg)
图片1 – Python集合并集 – 两个集合(图像作者)
计算这些集合的并集意味着我们想创建一个包含两者所有不同元素的新集合:
![Python集合union() - 5分钟完全指南 四海 第3张-四海吧 图片2 - Python集合并集 - 两个集合之间的并集(图像作者)](https://ai.miximages.com/betterdatascience.com/python-set-union/images/2.jpg)
图片2 – Python集合并集 – 两个集合之间的并集(图像作者)
Python集合union()
通常用Venn图表示。这就是它的样子:
![Python集合union() - 5分钟完全指南 四海 第4张-四海吧 图片3 - Python集合并集作为Venn图(图像作者)](https://ai.miximages.com/betterdatascience.com/python-set-union/images/3.jpg)
图片3 – Python集合并集作为Venn图(图像作者)
左边的集合有元素R和Julia,在右边的集合中不存在。同样,右边的集合有JavaScript和Go作为不同的元素。两个集合都有一个共同的元素 – Python。
请注意:如果一个项目在多个集合中出现,结果集将只列出该项目一次。
Python中set并集的语法
# 合并两个集合set1.union(set2)# 合并多个集合set1.union(set2, set3, ...)
其中:
set1
– 要与之合并的可迭代对象。set2
,set3
– 可选集合,要与之合并的其他可迭代对象。
Python中set并集的返回值
Python中set的union()
函数返回一个新的集合,该集合是所有集合中第一个集合的并集 – 但仅当传递了set(s)或可迭代对象到union()
函数中时。
如果没有传入参数到union()
函数中,将返回集合的副本。
Python中set并集函数的示例
我们将声明两组,就像上面的图片所示:
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'}
如果你没有给Python的union()
函数指定任何参数,那么它会复制这个集合:
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集合并集
每次都调用Python的union()
函数并不需要。你可以使用竖线(|
)运算符代替:
A = {'Python', 'R', 'Julia'}B = {'Python', 'JavaScript', 'Go'}print(f"A U B = {A | B}")
输出:
A U B = {'Go', 'Python', 'JavaScript', 'R', 'Julia'}
其他的都保持不变。这种方法比第一种更紧凑和易读,至少当你只合并两个集合时。
Python集合并集的高级示例
现在我们将介绍一些“高级”并集示例和用法:
- 多个集合参数
- set.update vs. set.union
- 可迭代对象的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'}
set.update vs. union
你可以使用set.update()
和set.union()
两种方法来执行Python中的并集运算。第一个方法将所有缺失的元素添加到调用它的集合中,并返回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 可迭代对象的并集
你可以在 Python 集合上调用union()
函数,并提供任何可迭代对象作为参数-以下是一个用 Python 列表作为参数的示例:
l1 = {1, 2, 3}l2 = [2, 3, 4]print(l1.union(l2))
输出:
{1, 2, 3, 4}
请记住:你不能使用简写的管道运算符:
l1 = {1, 2, 3}l2 = [2, 3, 4]print(l1 | l2)
输出:
![Python集合union() - 5分钟完全指南 四海 第5张-四海吧 Image 4 - 尝试对 Python 集合和列表求并集时出现 TypeError 错误(图像作者提供)](https://ai.miximages.com/betterdatascience.com/python-set-union/images/4.png)
图 4 – 尝试对 Python 集合和列表求并集时出现 TypeError 错误(图像作者提供)
你也不能使用除了 Python 集合外的其他数据类型进行操作,因为没有其他数据类型有union()
函数:
l1 = [1, 2, 3]l2 = [2, 3, 4]print(l1.union(l2))
输出:
![Python集合union() - 5分钟完全指南 四海 第6张-四海吧 Image 5 - 尝试在 Python 列表上调用 union() 函数时出现 AttributeError 错误(图像作者提供)](https://ai.miximages.com/betterdatascience.com/python-set-union/images/5.png)
图 5 – 尝试在 Python 列表上调用 union() 函数时出现 AttributeError 错误(图像作者提供)
简而言之 – 你必须始终使用union()
函数而不是管道运算符,并且必须在集合上调用该函数。
Python 集合并集性能(时间复杂度)
我们现在将分析 Python 中集合并集操作的时间复杂度。我在 Finxter 博客 上找到了源代码,并稍微修改了一下。总结一下:
- 在一个具有n个元素的集合上进行并集操作,并集参数具有m个元素,时间复杂度为 O(n + m)。
- 将元素插入到集合中的复杂度为 O(1)。
以下是计算和显示图中集合大小(X 轴)与运行时间(秒)(Y 轴)的 Python 代码。我在 M1 Pro MacBook Pro 16″ 上运行了该代码:
import timeimport matplotlib.pyplot as pltplt.rcParams['figure.figsize'] = (12, 5)plt.rcParams['axes.spines.top'] = Falseplt.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('Python set union() runtime vs. set size', size=20)plt.xlabel('Set size', size=14)plt.ylabel('Runtime (s)', size=14);
输出:
![Python集合union() - 5分钟完全指南 四海 第7张-四海吧 图片6 - Python set union() 时间复杂度图表(作者提供的图片)](https://ai.miximages.com/betterdatascience.com/python-set-union/images/6.jpg)
图片6 – Python set union() 时间复杂度图表(作者提供的图片)
结论
Python set union 很容易理解。我们探讨了定义和直观,逐渐建立了对更复杂用例的理解。你不得不承认 – 即使是高级部分也很容易消化。
文章最初发布在这里。经许可重新发布。