[外链图片转存中…(img-MMSQl132-1714069028485)]
下面的代码按照字母降序(这里指 Z-A)输出「dataScientist」集合中的值。
[外链图片转存中…(img-VMpVWBEK-1714069028486)]
首先我们必须强调的是,集合是从列表(list)中删除重复值的最快的方法。为了证明这一点,让我们研究以下两种方法之间的差异。
**方法 1:**使用集合删除列表中的重复值。
方法 2:使用一个列表推导式(list comprehension)从一个列表中删除重复值。
[外链图片转存中…(img-yTvbfp52-1714069028486)]
性能的差异可以用「timeit」库来测量,这个库允许你对 Python 代码进行计时。下面的代码将每种方法运行了 10,000 次,并且以秒为单位输出了总计时间。
[外链图片转存中…(img-LRGxxGUj-1714069028487)]
[外链图片转存中…(img-95wLhY0V-1714069028487)]
对比这两种方法,结果表明,使用集合删除重复值是更加高效的。虽然时间差异看似很小,但实际上在有一个非常大的列表时,能帮你节省很多的时间。
Python 中常用的集合方法是执行标准的数学运算,例如:求并集、交集、差集以及对称差。下图显示了一些在集合 A 和集合 B 上进行的标准数学运算。每个韦恩(Venn)图中的红色部分是给定集合运算得到的结果。
[外链图片转存中…(img-aLrHAwkp-1714069028488)]
Python 集合有一些让你能够执行这些数学运算的方法,还有一些给你等价结果的运算符。在研究这些方法之前,让我们首先初始化「dataScientist」和「dataEngineer」这两个集合。
并集
一个表示为「dataScientist ∪ dataEngineer」的并集,是属于「dataScientist」或「dataEngineer」或同时属于二者元素的集合。你可以使用「union」方法找出两个集合中所有唯一的值。
[外链图片转存中…(img-2uvO49I8-1714069028488)]
求并集操作返回的集合可以被可视化为下面的韦恩(Venn)图中的红色部分。
[外链图片转存中…(img-XYLgLyGK-1714069028488)]
交集
集合「dataScientist」和「dataEngineer」的交集可以表示为「dataScientist ∩ dataEngineer」,是所有同时属于两个集合的元素集合。
[外链图片转存中…(img-TlpJDyju-1714069028489)]
[外链图片转存中…(img-yG4TtLRs-1714069028489)]
交集运算返回的集合可以被可视化为下面韦恩图中的红色部分。
[外链图片转存中…(img-66I7cku0-1714069028489)]
你可能会发现,你会遇到你想确保两个集合没有共同值的情况。换句话说,你想得到两个交集为空的集合。这两个集合称为互斥集合,你可以使用「isdisjoint」方法测试两个集合是否为互斥。
[外链图片转存中…(img-5GoPqMSz-1714069028490)]
[外链图片转存中…(img-hnsV9lSQ-1714069028490)]
你会注意到,在如下韦恩图所示的交集中,「dataScientist」和「graphicDesigner」没有共有的值。
[外链图片转存中…(img-gHnvYo9I-1714069028491)]
差集
集合「dataScientist」和「dataEngineer」的差集可以表示为「dataScientist dataEngineer」,是所有属于「dataScientist」但不属于「dataEngineer」的元素集合。
[外链图片转存中…(img-TcFqGhJP-1714069028491)]
[外链图片转存中…(img-uajdiNdf-1714069028491)]
差集运算返回的结果可以被可视化为以下韦恩图中的红色部分。
[外链图片转存中…(img-of5Isylh-1714069028492)]
对称集
一个「dataScientist」和「dataEngineer」的对称集,表示为「dataScientist △ dataEngineer」,它是所有属于两个集合但不属于二者共有部分的集合。
[外链图片转存中…(img-KlIQ5oYr-1714069028492)]
[外链图片转存中…(img-SzvMvbvk-1714069028493)]
对称集运算返回的结果可以被可视化为下面韦恩图中的红色部分。
[外链图片转存中…(img-DLaHwCI9-1714069028493)]
集合推导式
你之前可能已经学习过列表推导式(list comprehensions)、字典推导式(dictionary comprehensions)和生成器推导式。这里还有一个集合推导式(Set Comprehension)。集合推导式和它们是很类似的,Python 中的集合推导式可以按照下面的方法构造:
[外链图片转存中…(img-WuElUM8m-1714069028493)]
上面的输出为一个包含 2 个值的集合,因为集合中相同的元素不能多次出现。使用集合推导式背后的动机是希望能够用手动进行数学运算的方法在代码中编写和推导式子。
[外链图片转存中…(img-oUN0sXIT-1714069028494)]
上面的代码与你之前学过的求差集类似,只是看上去有一点点不同。
成员检测
成员检测能够检查某个特定的元素是否被包含在一个序列中,例如字符串、列表、元组或集合。在 Python 中使用集合的一个主要的优点是,它们在 Python 中为成员检测做了深度的优化。例如,对集合做成员检测比对列表做成员检测高效地多。如果你是计算机科班出身,我们可以说,这是因为集合中成员检测的平均时间复杂度是 O(1)的而列表中则是 O(n)。
下面的代码展示了使用列表做成员检测的过程:
[外链图片转存中…(img-C1gphggw-1714069028494)]
[外链图片转存中…(img-c6nf5cCW-1714069028494)]
集合中也可以做类似的操作,只不过集合更加高效。
[外链图片转存中…(img-jYC9ssld-1714069028495)]
[外链图片转存中…(img-PaiPg2Vh-1714069028495)]
由于「possibleSet」是一个集合,而且「Python」是集合「possibleSet」中的一个元素,这可以被表示为「Python’ ∈ possibleSet」如果你有一个不属于集合的值,比如「Fortran」,这可以被表示为「Fortran’ ∉ possibleSet」。
子集
实际上集合的成员及成员的组合就是一个子集,让我们首先初始化两个集合。
如果集合「mySkills」中的每一个值都属于集合「possibleSkills」,那么「mySkills」被称为「possibleSkills」的一个子集,数学上写作「mySkills ⊆ possibleSkills」。你可以使用「issubset」方法检查一个集合是否是另一个集合的子集。
[外链图片转存中…(img-LgFPqo6A-1714069028495)]
因为在这个例子中,这个方法返回的是「True」。在下面的韦恩图中,请注意「mySkills」中的每一个值同时也在集合「possibleSkills」中。
[外链图片转存中…(img-89go9ZBk-1714069028496)]
不可变集
我们常常能看到嵌套的列表或元组,它们的元素可能是另一个列表或元组。
[外链图片转存中…(img-xc3oSrci-1714069028496)]
嵌套集合的问题在于,集合中通常不能包含集合等可变的值。在这种情况下,你可能希望使用一个不可变集(frozenset)。除了值不可以改变,不可变集和可变集是很相似的。你可以使用「frozenset()」创建一个不可变集。
[外链图片转存中…(img-LnpYAOFP-1714069028496)]
如果你使用如下所示的不可变集,就可以创建一个嵌套集合了。
[外链图片转存中…(img-wNHpFxFx-1714069028497)]
重要的是,你需要记住,不可变集的一个主要的缺点是:由于它们是不可变的,这意味着你不能向其中添加元素或者删除其中的元素。
感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的:
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化学习资料的朋友,可以戳这里无偿获取
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
3poaWd1aWd1,size_16,color_FFFFFF,t_70)
感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的:
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化学习资料的朋友,可以戳这里无偿获取