在上一节课中, 我们学习了有关集合所使用的许多不同方法, 其中包括 union 以及其他许多方法名称, 导致我们的大脑感到非常疲惫和混乱。
实际上, 对于集合而言, 存在一条被称之为捷径的操作方式, 具体表现为借助总共四个运算符, 通过直接使用相应的符号来进行交集、并集以及差集的运算处理过程, 这一做法完全不需要学习者去背诵任何相关的方法名称内容。
并且, 关于那个第四个符号这件事, 绝大多数人连见都没有见过它。
事先要先把两个集合准备好, 因为后面会需要不断地去使用它们。
s1 = {10, 20, 30, 40, 50, 60}s2 = {40, 50, 60, 70, 80, 90}
# 共同元素:40、50、60
为了让大家能够更直白地理解, 咱们可以把 S1 想象成你微信里面的那个好友名单, 同时把 S2 想象成你的那些朋友们各自的好友名单, 而你们几个人都共同认识的人呢, 就是数字 40、50 和 60。接下来的那四个运算符, 其实代表的就是四种不同的“去查看好友”的方法, 大家只要这么想就觉得好懂多了。
一、把所有人拉到一个群里边去, 这就叫做并集, 符号是那个竖线。
运算符:|(管道符,Shift + 反斜杠键)
所谓的并集这个玩意儿, 就是把两个集合里面的所有的元素都一股脑地凑在一块儿去, 至于那些重复出现的东西, 它会自动地把它们给去掉的。
你可以把它比方成把你和你朋友的所有的联系人全部拉进一个大群里面, 然后发现名字重复的人就只保留其中一个人。
s1 = {10, 20, 30, 40, 50, 60}s2 = {40, 50, 60, 70, 80, 90}
result = s1 | s2
print(result) # {10, 20, 30, 40, 50, 60, 70, 80, 90}
从10开始一直到90的全部都在里面, {40, 50, 60}重复的这些, 只留下一份。
那个竖线形状的符号被叫做管道符, 它所在的按键在键盘上是和反斜杠共用一个键的, 把Shift这个键按住然后同时按下去就可以把这个字符打出来了。
二、交集这个意思, 对应的符号是那个和号, 它指的也就是你两个人共同认识的那些人。
那个符号是&, 这个被叫做and符, 把它打出来的时候需要按下Shift键然后再按一下7。
所谓的交集, 指的就是在两个集合里面都共同拥有的那些元素。
这个情况就和在微信里面去查那个所谓共同好友的功能是完全一样的逻辑关系, 也就是说非得是两个人都在各自的好友列表里认识同一个人, 这算数的条件才成立。
s1 = {10, 20, 30, 40, 50, 60}s2 = {40, 50, 60, 70, 80, 90}
result = s1 & s2
print(result) # {40, 50, 60}
只有数字四十、五十、六十才是这两个集合里面共同拥有的那些数, 所以这个状况被称之为交集。
这个符号&是, 就位于键盘上数字7那个键位的上方位置, 大家需要按住Shift键和数字7同时输入来打出它, 它的含义相当于英文单词and, 意思就是指, 你和我两个人全都认识的那一种情况。
三、所谓的差集, 用现在的话来说, 就是指我这个人认识你但不认识的那些人。
就是减号, 直接在键盘上按那个键就行。
所谓的差集, 这个概念的意思其实就是指那些属于集合 A,却不属于集合 B 的元素。大家可以把中间的减号这个符号的理解方式想清楚一点, 减号这个东西, 它的核心意思就是说要“减掉”对方已经拥有的那些东西。
这种类比对, 就是我认识, 但是你认识的人, 然后我们要从我的好友名单里面, 把你的人也一起减掉给减掉, 最后剩下的部分, 那就确实就是属于我一个人单独拥有的了。
s1 = {10, 20, 30, 40, 50, 60}s2 = {40, 50, 60, 70, 80, 90}
# S1 减去 S2:属于 S1 但不属于 S2
result = s1 - s2
print(result) # {10, 20, 30}
# S2 减去 S1:属于 S2 但不属于 S1
result = s2 - s1
print(result) # {70, 80, 90}
大家要清楚一个非常重要的点, 那就是减号它是有方向的。如果咱们计算S1减去S2的话, 得到的结果是 {10, 20, 30}。但是, 如果反过来用S2去减去S1的话, 拿到的结果却是 {70, 80, 90}。
这意味着两边所呈现出来的结果是完全不一样的。所以, 谁放在前面、谁放在后面, 这个顺序就直接决定了究竟是从哪个集合里面进行减法操作。
四、所谓对称差集^这个概念, 其实就是各玩各的这一个意思在里头, 就是把那些共同好友的东西统统给去掉不要算了。
运算符, 符号就是那个尖角号, 这个符号通常叫做托字符或者插入符, 在键盘上面按住 Shift 键再按数字 6 就能打出来。
所谓对称差集, 它的意思是那个元素呢, 要么是属于 S1 的, 要么是归属于 S2 的, 只不过这个条件比较严格一点, 就是说它绝对不能既在 S1 里头, 又在 S2 里头。
咱们可以换另外一个更直白点的说法来理解, 第一步先去找一下两边的交集在哪里, 发现就是 {40, 50, 60} 这三个东西。第二步, 就把两个大集合里面不属于上面说的那个交集的所有其他的元素都统统地找出来, 然后把它们都放在一起, 这样就组合成了一个全新的集合了。
类比的方式, 就是让你两个各自拥有且别人没有的朋友聚在一起, 除此之外其他的共同好友全部排除在外。说穿了, 这就意味着采取互不干涉、各自进行各自活动的模式对待彼此的关系或者社交情况。
s1 = {10, 20, 30, 40, 50, 60}s2 = {40, 50, 60, 70, 80, 90}
result = s1 ^ s2
print(result) # {10, 20, 30, 70, 80, 90}
在产生的结果中, 包含了 S1 所独有的集合 {10, 20, 30}, 同时也包含了 S2 所独有的集合 {70, 80, 90}, 但是那些同时在两边都出现的集合 {40, 50, 60}, 都被从结果里给排除了。
对称差集不存在方向性的问题, 因为 S1 ^ S2 这个计算得到的结果和 S2 ^ S1 这个计算得到的结果是完全一样的。这主要是由于无论如何安排它们的先后顺序, “各自只拥有一个而另一个并不持有的”这一核心逻辑在本质上是相互对应的, 所以即便互换前后的位置, 最终得出的结论也不会发生任何改变。
为什么第4个符号会变得这么冷门?
前三个符号多多少少都见过: 竖线在命令行里面被叫作管道, & 号在任何编程语言里通常都表示与逻辑, 减号也就是最为普通的减法符号。
可是那个被称为脱字符的 ^ 符号, 在实际编程里面的出场频率是非常低的, 绝大多数人在第一次见到这个符号的时候根本就不知道它位于键盘上的哪一个位置, 它其实处在数字 6 键的位置上面, 是按住 Shift 键再加按 6 键出来的效果。
它所做的事情本质上并不难以理解,说白了就是让两边各自独有的部分进行合并, 然后把相同的部分全部去掉, 这个名字里之所以带着一个“对称”的说法, 其实它的含义就是指左右两边的结构互相交换之后, 所得到的最终结果仍然保持是不变的。
五、这里是对这四个运算符所做的总结的第六章内容, 也就是关于运算符和方法名之间的对照关系, 这部分说明了针对同一类型的业务逻辑或者同一个功能点, 存在着两种不同的表现形式或书写策略。
这4个运算符和上一节当中所学习到的那些方法, 从本质上来说, 其实是属于同一个事物的两种不同的表现形式罢了:
运算符的部分显得更为简洁一些, 而方法名称则更加直观易懂。在实际的开发工作当中, 这两种方式都是十分常见的, 你可以选择自己较为喜欢的那个来进行使用。
大家需要注意的是, 那四个运算符在进行操作的时候, 完全不会去改动原本的那个集合对象, 而是把计算出来的结果当作一个新的集合对象再给返回给你。
如果你还能回想起来上一节里面提到的那个括号形式的大括号内容是什么情况的话, 你会知道它属于一个很特别的异类, 它的作用就是直接地对原集合进行更改动作, 并且这个方式也是没有任何对应的返回值存在的, 同时它还没有一个和它能够匹配的使用的运算符的。
但是运算符所做的事情却是很简单的, 它就只是负责算出一个新的东西交给你而已, 绝对不负责直接地去篡改原件本身的。
七、这 4 个运算符之间存在一个共同的地方, 也就是说, 它们具备相同的特征。
不管你是去用哪一个运算符号, 都是会有这么几条规律的存在的。
1. 对原始的集合不进行任何改变, 在经过运算处理完成之后, 原有的 S1 和 S2 维持它们原本的状态, 而计算得到的结果则是被存放到了一个新的变量当中去。
2. 会返回一个新的集合适合物, 这个特点, 是和那个括号里面空着没写什么东西的写法、还有那个 union 这个方法呀都是一样的, 然后这个运算符给你呈现出来的, 它可不是原来就在那个地方的对象, 而是一个全新的、单独创建的集合物件。
3. 最后呈现出来的数据结果依然是一个集合数据类型, 这个集合在处理过程中会自动执行去重操作, 因此绝对不会出现包含重复元素的情况。
s1 = {10, 20, 30, 40, 50, 60}s2 = {40, 50, 60, 70, 80, 90}
result = s1 | s2
print(s1) # 原封不动
print(s2) # 原封不动
print(result) # 新集合,自动去重
总结
大家要知道的是集合里面有四个数学运算符号, 可以用一句话的办法把它们全都清清楚楚地记住。
|(管道符)= 并集 = 全员拉群,重复的留一个
这个&符号, 也就是and这种意思的那个符, 它等于交集, 意思就是共同好友, 必须得两边都有的那个才算数的。
把那个减号等于差集这种表示方法给理解清楚, 这指的是我独有部分的存在, 并且这里是需要着重去注意一个方向的设定的。
那个用^这个符号来代表的托字符, 它的实际意思就叫做对称差集, 说白了就是各玩各的, 把共同的好友这一层关系直接给去掉不要。
前3个符号, 多少是见过面的, 第4个托字符, 确确实实是比较冷门的——但是它所干的事情, 一点也不复杂, 就是“把两边各自独有的部分凑到一起, 然后把共同的部分扔掉”。需要记住它没有方向, S1 ^ S2 和 S2 ^ S1 结果是一样一样的。
运算符和方法名的效果是一样的, 但是写代码的时候用运算符会更短一些。唯一值得注意的一点是, 运算符只会负责返回一个全新的集合, 并不会去干“直接修改原对象”这件事情, 因为那件事情是属于其他特定功能的专利范围的。