python中集合运算_入门 | 一文带你了解Python集合与基本的集合运算

原标题:入门 | 一文带你了解Python集合与基本的集合运算

选自DataCamp

作者:Michael Galarnyk

参与:Geek Ai、思源

一般我们熟悉 Python 中列表、元组及字典等数据结构,但集合可能用得稍微少一点。但集合独特的元素唯一性与 O(1) 时间复杂度的成员检测方法,令其在很多任务中有特别的优势。本文介绍了 Python 集合的常见方法与概念,包括集合元素的操作、基本集合运算以及不可变集等。

了解 Python 集合: 它们是什么,如何创建它们,何时使用它们,什么是内置函数,以及它们与集合论操作的关系

集合、 列表与元组

列表(list)和元组(tuple)是标准的 Python 数据类型,它们将值存储在一个序列中。集合(set)是另一种标准的 Python 数据类型,它也可用于存储值。它们之间主要的区别在于,集合不同于列表或元组,集合中的每一个元素不能出现多次,并且是无序存储的。

Python 集合的优势

由于集合中的元素不能出现多次,这使得集合在很大程度上能够高效地从列表或元组中删除重复值,并执行取并集、交集等常见的的数学操作。

本教程将向你介绍一些关于 Python 集合和集合论的话题:

如何初始化空集和带有数值的集合

如何向集合中添加值或者从集合中删除值

如何高效地使用集合,用于成员检测、从列表中删除重复值等任务。

如何执行常见的集合操作,例如求并集、交集、差集以及对称差。

可变集合和不可变集之间的区别

有了这个提纲,让我们开始吧。

集合初始化

集合是一个拥有确定(唯一)的、不变的的元素,且元素无序的可变的数据组织形式。

你可以使用「set()」操作初始化一个空集。

emptySet = set()

如果要初始化一个带有值的集合,你可以向「set()」传入一个列表。

dataScientist = set([ 'Python', 'R', 'SQL', 'Git', 'Tableau', 'SAS'])

dataEngineer = set([ 'Python', 'Java', 'Scala', 'Git', 'SQL', 'Hadoop'])

cb382c2cd6764da8bcd7983f0391d20f.jpeg

如果你观察一下上面的「dataScientist」和「dataEngineer」集合中的变量,就会发现集合中元素值的顺序与添加时的顺序是不同的,这是因为集合是无序的。

集合包含的值也可以通过花括号来初始化。

dataScientist = { 'Python', 'R', 'SQL', 'Git', 'Tableau', 'SAS'}

dataEngineer = { 'Python', 'Java', 'Scala', 'Git', 'SQL', 'Hadoop'}

3f97c954043b4785bd1f7a999bc2c2e0.jpeg

请牢记,花括号只能用于初始化包含值的集合。如下图所示,使用不包含值的花括号是初始化字典(dict)的方法之一,而不是初始化集合的方法。

a5d4dceeba84402fa187194d37710e62.png

向集合添加值或删除值

要想向集合中添加值或从中删除值,你首先必须初始化一个集合。

# Initialize set withvalues

graphicDesigner = { 'InDesign', 'Photoshop', 'Acrobat', 'Premiere', 'Bridge'}

向集合中添加值

你可以使用「add」方法向集合中添加一个值。

graphicDesigner.add( 'Illustrator')

43b34a5524424f5d9b0a320df37ddffa.png

需要注意的一点是,你只能将不可变的值(例如一个字符串或一个元组)加入到集合中。举例而言,如果你试图将一个列表(list)添加到集合中,系统会返回类型错误「TyprError」。

graphicDesigner.add([ 'Powerpoint', 'Blender'])

13d7d5f36817448f80addcb237eb0936.jpeg

从集合中删除值

有好几种方法可以从集合中删除一个值:

选项 1:你可以使用「remove」方法从集合中删除一个值。

graphicDesigner.remove( 'Illustrator')

f08bb5b9001b43a8ae5c14aebaf0e52b.jpeg

这种方法的一个缺点是,如果你想要删除一个集合中不存在的值,系统会返回一个键值错误「KeyError」。

7a567edb734a454ba5b70b7a154fe30b.jpeg

选项 2:你可以使用「discard」方法从集合中删除一个值。

graphicDesigner.discard( 'Premiere')

ea9a48dbda9e4557bfa43c0d79df164f.jpeg

这种方法相对于「remove」方法的好处是,如果你试图删除一个集合中不存在的值,系统不会返回「KeyError」。如果你熟悉字典(dict)数据结构,你可能会发现这种方法与字典的「get」方法的工作模式相似。

选项 3:你还可以使用「pop」方法从集合中删除并且返回一个任意的值。

graphicDesigner.pop()

54db04c8e864484abe95c199033aba41.jpeg

需要注意的是,如果集合是空的,该方法会返回一个「KeyError」。

删除集合中所有的值

你可以使用「clear」方法删除集合中所有的值。

graphicDesigner.clear()

0923487b8f154de7bba829102e6549e1.png

在集合上进行迭代

与许多标准 Python 数据类型一样,用户可以在集合(set)上进行迭代。

# Initialize a set

dataScientist = { 'Python', 'R', 'SQL', 'Git', 'Tableau', 'SAS'}

forskill indataScientist:

print(skill)

1331461a4b584733bef3c70a28285f74.png

如果你仔细观察「dataScientist」集合中打印出来的每一个值,你会发现集合中的值被打印出来的顺序与它们被添加的顺序是不同的。

将集合中的值变为有序

本教程已经向大家强调了集合是无序的。如果你认为你需要以有序的形式从集合中取出值,你可以使用「sorted」函数,它会输出一个有序的列表。

type(sorted(dataScientist))

6fa3e991a2e04c0db6ea6968748c68bd.jpeg

下面的代码按照字母降序(这里指 Z-A)输出「dataScientist」集合中的值。

sorted(dataScientist, reverse = True)

e7763bafd3e040d49e1ec417c663d067.png

删除列表中的重复项

首先我们必须强调的是,集合是从列表(list)中删除重复值的最快的方法。为了证明这一点,让我们研究以下两种方法之间的差异。

方法 1:使用集合删除列表中的重复值。

print(list(set([ 1, 2, 3, 1, 7])))

方法 2:使用一个列表推导式(list comprehension)从一个列表中删除重复值。

def remove_duplicates(original):

unique = []

[unique.append(n) forn inoriginal ifn not inunique]

return(unique)

print(remove_duplicates([ 1, 2, 3, 1, 7]))

性能的差异可以用「timeit」库来测量,这个库允许你对 Python 代码进行计时。下面的代码将每种方法运行了 10,000 次,并且以秒为单位输出了总计时间。

importtimeit

# Approach 1: Execution time

print(timeit.timeit( 'list(set([1, 2, 3, 1, 7]))', number= 10000))

# Approach 2: Execution time

print(timeit.timeit( 'remove_duplicates([1, 2, 3, 1, 7])', globals=globals(), number= 10000))

7c0396d907b24faabc7dcd709eac474d.jpeg

对比这两种方法,结果表明,使用集合删除重复值是更加高效的。虽然时间差异看似很小,但实际上在有一个非常大的列表时,能帮你节省很多的时间。

集合运算方法

Python 中常用的集合方法是执行标准的数学运算,例如:求并集、交集、差集以及对称差。下图显示了一些在集合 A 和集合 B 上进行的标准数学运算。每个韦恩(Venn)图中的红色部分是给定集合运算得到的结果。

e1e7a947e4c6459f9d81ef9a233fdf03.jpeg

Python 集合有一些让你能够执行这些数学运算的方法,还有一些给你等价结果的运算符。在研究这些方法之前,让我们首先初始化「dataScientist」和「dataEngineer」这两个集合。

dataScientist = set([ 'Python', 'R', 'SQL', 'Git', 'Tableau', 'SAS'])

dataEngineer = set([ 'Python', 'Java', 'Scala', 'Git', 'SQL', 'Hadoop'])

并集

一个表示为「dataScientist ∪ dataEngineer」的并集,是属于「dataScientist」或「dataEngineer」或同时属于二者元素的集合。你可以使用「union」方法找出两个集合中所有唯一的值。

# set built- infunctionunion

dataScientist.union(dataEngineer)

# EquivalentResult

dataScientist| dataEngineer

e8c9cdbd6a7b498db74463010cec905f.png

求并集操作返回的集合可以被可视化为下面的韦恩(Venn)图中的红色部分。

f8153885d4b04b56aa1f051079e815e2.jpeg

交集

集合「dataScientist」和「dataEngineer」的交集可以表示为「dataScientist ∩ dataEngineer」,是所有同时属于两个集合的元素集合。

# Intersection operation

dataScientist.intersection(dataEngineer)

# Equivalent Result

dataScientist & dataEngineer

7ad28c3132724535b96fa3467fddad1a.jpeg

交集运算返回的集合可以被可视化为下面韦恩图中的红色部分。

f80f38eda3384adb8b10529ced127a86.jpeg

你可能会发现,你会遇到你想确保两个集合没有共同值的情况。换句话说,你想得到两个交集为空的集合。这两个集合称为互斥集合,你可以使用「isdisjoint」方法测试两个集合是否为互斥。

# Initialize a set

graphicDesigner = { 'Illustrator', 'InDesign', 'Photoshop'}

# These sets have elements incommon so it would returnFalse

dataScientist.isdisjoint(dataEngineer)

# These sets have no elements incommon so it would returnTrue

dataScientist.isdisjoint(graphicDesigner)

ad768228d717465fbaca507eaddf91e6.jpeg

你会注意到,在如下韦恩图所示的交集中,「dataScientist」和「graphicDesigner」没有共有的值。

2970d3bb081845459b708e52b4e61cdc.jpeg

差集

集合「dataScientist」和「dataEngineer」的差集可以表示为「dataScientist dataEngineer」,是所有属于「dataScientist」但不属于「dataEngineer」的元素集合。

# Difference Operation

dataScientist.difference(dataEngineer)

# Equivalent Result

dataScientist - dataEngineer

cf4f6bc809c24e6bbb2700adac7945ee.png

差集运算返回的结果可以被可视化为以下韦恩图中的红色部分。

31ff2a6ffe2b4fed9807aedefa7b3e48.jpeg

对称集

一个「dataScientist」和「dataEngineer」的对称集,表示为「dataScientist △ dataEngineer」,它是所有属于两个集合但不属于二者共有部分的集合。

# Symmetric Difference Operation

dataScientist.symmetric_difference(dataEngineer)

# Equivalent Result

dataScientist ^ dataEngineer

d4e47fca523a4337843ad1af651579ab.png

对称集运算返回的结果可以被可视化为下面韦恩图中的红色部分。

99e5551b105b4cd28ebc5737bdd19257.jpeg

集合推导式

你之前可能已经学习过列表推导式(list comprehensions)、字典推导式(dictionary comprehensions)和生成器推导式。这里还有一个集合推导式(Set Comprehension)。集合推导式和它们是很类似的,Python 中的集合推导式可以按照下面的方法构造:

{skill forskill in[ 'SQL', 'SQL', 'PYTHON', 'PYTHON']}

2df1e81e076a439699a468ef83e5e6fe.png

上面的输出为一个包含 2 个值的集合,因为集合中相同的元素不能多次出现。使用集合推导式背后的动机是希望能够用手动进行数学运算的方法在代码中编写和推导式子。

{skill forskill in[ 'GIT', 'PYTHON', 'SQL'] ifskill not in{ 'GIT', 'PYTHON', 'JAVA'}}

152c0294912842c780d2459e62f74107.png

上面的代码与你之前学过的求差集类似,只是看上去有一点点不同。

成员检测

成员检测能够检查某个特定的元素是否被包含在一个序列中,例如字符串、列表、元组或集合。在 Python 中使用集合的一个主要的优点是,它们在 Python 中为成员检测做了深度的优化。例如,对集合做成员检测比对列表做成员检测高效地多。如果你是计算机科班出身,我们可以说,这是因为集合中成员检测的平均时间复杂度是 O(1)的而列表中则是 O(n)。

下面的代码展示了使用列表做成员检测的过程:

# Initialize a list

possibleList = [ 'Python', 'R', 'SQL', 'Git', 'Tableau', 'SAS', 'Java', 'Spark', 'Scala']

# Membership test

'Python'inpossibleList

0d550fa108c742f9ac82647559506dee.png

集合中也可以做类似的操作,只不过集合更加高效。

# Initialize a set

possibleSet = { 'Python', 'R', 'SQL', 'Git', 'Tableau', 'SAS', 'Java', 'Spark', 'Scala'}

# Membership test

'Python'inpossibleSet

57a9c6c79dcd4bdaa23c813b688bfcd2.png

由于「possibleSet」是一个集合,而且「Python」是集合「possibleSet」中的一个元素,这可以被表示为「Python' ∈ possibleSet」如果你有一个不属于集合的值,比如「Fortran」,这可以被表示为「Fortran' ∉ possibleSet」。

子集

实际上集合的成员及成员的组合就是一个子集,让我们首先初始化两个集合。

possibleSkills = { 'Python', 'R', 'SQL', 'Git', 'Tableau', 'SAS'}

mySkills = { 'Python', 'R'}

如果集合「mySkills」中的每一个值都属于集合「possibleSkills」,那么「mySkills」被称为「possibleSkills」的一个子集,数学上写作「mySkills ⊆ possibleSkills」。你可以使用「issubset」方法检查一个集合是否是另一个集合的子集。

mySkills.issubset(possibleSkills)

2ef168c745464abca14dccfeeaabc465.png

因为在这个例子中,这个方法返回的是「True」。在下面的韦恩图中,请注意「mySkills」中的每一个值同时也在集合「possibleSkills」中。

259fb6ff4b244797bd57884f901df594.jpeg

不可变集

我们常常能看到嵌套的列表或元组,它们的元素可能是另一个列表或元组。

# Nested Lists and Tuples

nestedLists = [[ 'the', 12], [ 'to', 11], [ 'of', 9], [ 'and', 7], [ 'that', 6]]

nestedTuples = (( 'the', 12), ( 'to', 11), ( 'of', 9), ( 'and', 7), ( 'that', 6))

76aac6ecbefa43f38233184caa4df2cc.jpeg

嵌套集合的问题在于,集合中通常不能包含集合等可变的值。在这种情况下,你可能希望使用一个不可变集(frozenset)。除了值不可以改变,不可变集和可变集是很相似的。你可以使用「frozenset()」创建一个不可变集。

# Initialize a frozenset

immutableSet = frozenset()

daf6ffa3ea454756b67d904be6d06d2f.png

如果你使用如下所示的不可变集,就可以创建一个嵌套集合了。

nestedSets = set([frozenset()])

b9b642231cde47ee9299000becc11e3e.png

重要的是,你需要记住,不可变集的一个主要的缺点是:由于它们是不可变的,这意味着你不能向其中添加元素或者删除其中的元素。

结语

Python 集合是非常实用的,它能够高效地从列表等数据结构中删除重复的值,并且执行常见的数学运算,例如:求并集、交集。人们经常遇到的一个挑战是:何时使用各种数据类型,例如什么时候使用集合或字典。作者希望本文能展示基本的集合概念,并有利于我们在不同任务中使用不同的数据类型。

原文链接:https://www.datacamp.com/community/tutorials/sets-in-python

本文为机器之心编译,转载请联系本公众号获得授权。返回搜狐,查看更多

责任编辑:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559563.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中文本文件r_Python如何读写文本文件

展开全部 1.open使用open打开文件后一定要记2113得调5261用4102文件对象的close()方法。比如可以用try/finally语句来确保最后1653能关闭文件。 file_object open(thefile.txt) try: all_the_text file_object.read( ) finally: file_object.close( ) 注:不能把op…

台式计算机性能清单是强制的吗,教你识别良心商家和奸商电脑配置清单区别以及如何选购台式电脑机箱...

我们想要组装一台电脑,由于隔行如隔山,无疑对硬件品牌型号都不太了解,会将自己的预算和大致的要求和商家说,而商家会根据预算与要求写具体的电脑配置清单,不同商家写出来的配置或多或少存在不同,含糊不清写…

mysql显示表已存在_MySQL数据库与数据表的相关操作

数据库相关操作:显示数据库:show databases;如果是0.00秒并不代表没有花费时间,而是时间非常短,小于0.01秒。创建数据库:Query OK表示创建成功,1行受到影响,处理时间为0、05秒。使用下面的命令查…

怎么用计算机算成250,万能计算器

彩票彩宝贝体彩排列五March 29, 2016彩票计划网站导航Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse ultrices egestas nunc, quis venenatis orci tincidunt id. Fusce commodo blandit eleifend. Nullam viverra tincidunt dolor, at pulvinar dui.…

android怎样判断插入数据是否成功_MySQL一个表的自增id用完了,背井大佬让我用这些姿势再往里插数据...

点击上方"码之初"关注,选择"设为星标"与精品技术文章不期而遇在之前有篇文章中,和大家探讨了在MySOL数据库中,一个表的自增id用完,再插入数据有什么问题?评论处 背井 公众号的大佬建议我另开一篇再…

计算机硬件系统教具,计算机硬件系统 (2)

计算机硬件系统 (2) (3页)本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!9.9 积分计算机硬件系统克井一中杨致远教学目标:1、了解计算机的发展概况、特点以及种类2、理解计算机的工作原理3…

经典计算机实现量子逻辑门,量子计算机:对量子逻辑门的探讨

在分析了经典比特和量子比特的异同点之后,阐述了量子逻辑门的特点;然后具体介绍了几种常见的量子逻辑门:基本量子逻辑门,量子异或门,量子与门。最后又给出了更复杂的量子逻辑门的构建方法。维普资讯 http://doc.wendoc.com信息科学}J宋纳红侯丽敏科量子计算机&#…

命名空间中不存在名称_原木定制中不开裂的木材真的存在吗?

广大的读者朋友们大家好,之前壹信缅甸柚木高端全屋定制小编和大家讲解了为什么那么多人喜欢原木实木全屋定制护墙板,本文壹信小编将给大家讲讲原木整装中不开裂的木材真的存在吗。原木整装行业的从业人员都知道,最麻烦最让人担心的是木头的开…

go 字符串替换_Go语言爱好者周刊:第 64 期 — goup 这个工具了解下

这里记录每周值得分享的 Go 语言相关内容,周日发布。本周刊开源(GitHub:polaris1119/golangweekly),欢迎投稿,推荐或自荐文章/软件/资源等,请提交 issue 。鉴于大部分人可能没法坚持把英文文章看…

opencore0.6.3_Ubuntu 18.04 源码编译安装 PHP 7.3

记录在Ubuntu 18.04下源码编译安装 PHP 7.3的过程步骤。0.下载PHP源代码首先需要从PHP官网下载PHP7.3.1的源代码,保存为php-7.3.1.tar.xz。http://cn2.php.net/distributions/php-7.3.1.tar.xz在上述文件保存的目录中打开终端,使用命令将其解压&#xff…

photoshop案例_玩手机不如学PS!200集入门到精通Photoshop自学教程分享3

大家都知道Photoshop(PS)的功能非常的强大,它具有强大的绘图、校正图片及图像创作功能!人们可以利用它创作出具有原创性的作品。应用极为广泛,常应用于平面设计、网页设计、插画设计、界面设计、数码照片与图像的修复、…

西浦与杭电计算机选哪个,四邮四电究竟谁强谁弱?哪三所大学报考更有性价比?...

四邮 北京邮电学院 南京邮电学院 西安邮电大学 重庆邮电学院 四电 西安电子科技大学 电子科技大学 桂林电子科技大学 杭州电子科技大学。总体来说:成电西电>北邮>杭电>南邮重邮≈桂电>西邮。实力基本和各校年经费成正比,成电>西电>北邮…

android 获取当前时间_js如何获取当前时间并显示

js可以通过Date对象获取当前日期和时间,使用Date()获取系统当前时间,在使用getFullYear()、getMonth()、getDate() 、getHours()等方法获取特定格式的时间,在使用innerHTM方法显示。web前端学习:打造全网web前端全栈资料库&#x…

css居中的几种方法_CSS布局中的水平居中的方法

在我们做网站的过程中,怎么都逃不掉居中这个话题,各种花里胡哨的,可能只需要掌握两三个就可以完成一个网页的布局了。今天就来介绍下水平居中有哪些方法。第一种,设置当前元素水平居中,元素为block时要让p元素水平居中…

如何唤醒计算机,待机后如何唤醒计算机?介绍睡眠待机的优势

当我们将鼠标拖到习惯的位置时,我们会发现计算机实际上包括三个选项:关机,重新启动和睡眠。睡眠意味着您暂时不需要使用计算机,但是在需要时,界面可以保持不变。但是很不知道睡觉后怎么醒?如果您无法成功唤…

apollo 配置中心_配置中心——Apollo小记

一、什么是配置配置是程序运行时,动态调整行为的能力。配置有以下属性:配置是独立于程序的只读变量同一份程序在不同的配置下才会有不同的行为,而且配置对于程序来说是只读的,所以程序可以通过读取配置来改变自己的行为&#xff0…

html红色星号怎么做_码农的插花艺术:HTML(一)

这是笔者学习html的过程中的小小心得和体会,由于笔者也是前端初学者,能力有限难免出错,恳请各位读者看到有错误的地方多多包涵,也欢迎各位在评论区积极讨论。严格来讲html并不算一种“语言”。html的文档可以以txt的形式保存&…

scrapy没有运行结果_关于Scrapy爬虫项目运行和调试的小技巧(下篇)

前几天给大家分享了关于Scrapy爬虫项目运行和调试的小技巧上篇,没来得及上车的小伙伴可以戳超链接看一下。今天小编继续沿着上篇的思路往下延伸,给大家分享更为实用的Scrapy项目调试技巧。三、设置网站robots.txt规则为False一般的,我们在运用…

easyui datagrid oncheck 修改行样式_100 种 PPT 图表样式送给你

你好,这里是诺灰屋我是诺灰距离上一篇推文,已有近一个月的时间没有给大家写推送了。这期间,我一直在进行数据图表方面知识的网络调研。甚至于在知网上找了几篇论文来看,当然,内容很枯燥,不实用。同时&#…

系统如何启动数据库服务器,怎么启动sql数据库服务器

怎么启动sql数据库服务器 内容精选换一换PostgreSQL支持逻辑备份。您可使用pg_dump逻辑备份功能,导出备份文件,再通过psql导入到RDS中,实现将PostgreSQL的数据导入到云数据库RDS中。云数据库RDS服务支持开启公网访问功能,通过弹性…