写点什么

8. ㊙ Python 集合三板斧,滚雪球学 Python

发布于: 2021 年 02 月 13 日
8. ㊙ Python 集合三板斧,滚雪球学 Python

学编程要简单、粗暴。更要有效,很多时候学的越多,忘得越快。但编程总有那么一天顿悟的时候,而顿悟的契机目前就是建立在你跟橡皮擦坚持打卡 100 天,在评论区坚持跟橡皮擦卡学习的朋友,在 100 天之后,橡皮擦将送出 神秘大奖

本系列文章将在2021年春节前完成,欢迎关注,点赞,评论 --- 梦想橡皮擦


八、Python 中一个无序且元素唯一的数据类型,它是集合。


8.1 集合是啥


集合是一个数据类型,它其中的每个元素的顺序不固定,但唯一。多么绕的一句话,回味,一定要好好回味。


集合中的元素内容必须是不可变类型,例如整数、浮点数、字符串、元组等内容,可变的列表、字典、集合不可以。


集合本身是可变的,跟列表一样可以增删元素。


8.1.1 集合的声明


截止到现在,小括号用来声明元组,中括号用来声明列表,大括号用来声明字典,那集合怎么办?Python 中也是用大括号来声明集合。当然你也可以通过 set 函数建立集合。


集合定义的语法格式如下:


my_set = {元素1,元素2,...}
复制代码

简单的代码示例如下:

my_set = {1, 2, 3, 3, 10, 4, 5, 6}
print(my_set)
复制代码


数据输出之后,会发现重复的整数 3 只剩下一个了。还是因为集合的元素是唯一的,出现重复多的部分将会舍去。


如果在集合中使用了可变类型作为元素,会报错。


my_set = {1, 2, 3, [3, 10, 4, 5, 6]}# 错误提示:TypeError: unhashable type: 'list'print(my_set)
复制代码


这里需要注意下,空集合的声明不能使用 {},只用一个大括号表示的是空字典。声明一个空集合需要用到 set 函数。


8.1.2 set 函数定义集合


使用 set 函数可以定义集合,并且可以定义空集合。set 函数参数可以为字符串、列表、元组。


通过 set 定义空集合


my_dict = {}my_set = set()
# 空字典print(type(my_dict))# 空集合print(type(my_set))
复制代码


set 将字符串转换成集合


set 函数类似一个强制转换,可以将其它类型的转换成集合。


my_set = set("my name is xiangpica")print(my_set)
复制代码


该内容会过滤重复字母,并且输出的顺序不定,因为集合是无序的。


集合可以对元组去重


借助集合元素的不允许重复,可以实现一些特定的效果,例如去重。


my_tuple = ("apple", "orange", "orange", "pear", "banana", "food")my_set = set(my_tuple)print(my_set)
复制代码


8.2 集合的操作


在学集合相关操作前,需要在学习一些符号。


| 符号 | 含义 |

| ---- | -------- |

| & | 交集 |

| \| | 并集 |

| - | 差集 |

| ^ | 对称差集 |


接下来的内容就非常类似高中线代里面的概念了,求集合的交并差集。


8.2.1 交集(intersection)


交集就是求两个集合共有的元素。


my_set1 = {"apple", "orange", "pear", "banana", "food"}my_set2 = {"apple", "orange", "pear"}
both = my_set1 & my_set2print(both)
复制代码


除了通过 & 符号以外,还可以通过集合的 intersection 方法完成。


my_set1 = {"apple", "orange", "pear", "banana", "food"}my_set2 = {"apple", "orange", "pear"}
both = my_set1.intersection(my_set2)print(both)
复制代码


8.2.2 并集(union)


并集就是取所有集合的所有元素,如果出现重复的保留一个。使用符号 | 或者 union 方法完成。


my_set1 = {"apple", "orange", "pear", "banana", "food"}my_set2 = {"apple", "orange", "pear"}
both = my_set1 | my_set2print(both)
复制代码


使用 union 完成。


my_set1 = {"apple", "orange", "pear", "banana", "food"}my_set2 = {"apple", "orange", "pear"}
both = my_set1.union(my_set2)print(both)
复制代码


8.2.3 差集(difference)


对于求集合的差集与交并集不同,有个先后顺序问题,例如属于 A 但不属于 B 表示为 A-B,同理属于 B 但不属于 A,表示为 B-A。


差集的符号是 -,可以使用 difference 方法进行运算。


my_set1 = {"apple", "orange", "pear", "banana", "food"}my_set2 = {"apple", "orange", "pear", "grape"}# 求解属于 A,但不属于 B 的元素dif1 = my_set1 - my_set2print(dif1)# 求解属于 B,但不属于 A 的元素dif2 = my_set2 - my_set1print(dif2)
复制代码


接下来如何使用 difference 方法去求差集就交给你自己完成啦。


8.2.4 对称差集(symmetric difference)


A 与 B 两个集合,如果想要获得属于 A 或者 B 集合的元素,但又不要属于 A 且属于 B 的元素,这时就是对称差集的应用场景了。


对称差集的符号是 ^,方法名是 symmetric_difference


my_set1 = {"apple", "orange", "pear", "banana", "food"}my_set2 = {"apple", "orange", "pear", "grape"}
dif = my_set1 ^ my_set2print(dif)
复制代码


上述代码就会输出既不属于 A 也不属于 B 的元素,即对称差集。


8.3 集合的方法


8.3.1 集合的增删


add 方法可以在集合中增加元素,语法格式如下:


my_set.add(新增元素)
复制代码


第一个需要注意的新的元素如果已经存在集合中,不会新增进去,第二个需要注意的是集合是无序的,新增加元素的位置将不确定。


my_set = {"apple", "orange", "pear", "grape"}my_set.add("new")my_set.add("new")print(my_set)
复制代码


remove 方法可以删除集合中元素,前提是该元素在集合中,如果删除不存在的元素报错。


my_set = {"apple", "orange", "pear", "grape"}
my_set.remove("apple")
print(my_set)# 第二次删除报错 因为 apple 已经不在集合中my_set.remove("apple")print(my_set)
复制代码


discard 方法可以删除集合元素,如果元素不存在不会报错。


my_set = {"apple", "orange", "pear", "grape"}
my_set.discard("apple")print(my_set)
my_set.discard("apple")print(my_set)
复制代码


pop 方法为随机删除一个元素,被删除的元素会被返回,即可以用一个变量接收被删除的元素,如果集合为空使用 pop 会报错。


my_set1 = {"apple", "orange", "pear", "grape"}
# pop 方法随机删除一个元素,将被删除的元素返回var = my_set1.pop()print(var)
# 空集合使用 pop 方法报错my_set2 = set()var = my_set2.pop()print(var)
复制代码


clear 方法删除集合内的所有元素


my_set1 = {"apple", "orange", "pear", "grape"}
my_set1.clear()print(my_set1)
复制代码


8.3.1 集合的其它方法


isdisjoint 方法用于判断两个集合是否存在相同元素,没有返回 True,否则返回 False。


my_set1 = {"apple", "orange", "pear", "grape"}my_set2 = {"banana", "watermelon"}
# 两个集合没有相同元素ret_bool = my_set1.isdisjoint(my_set2)print(ret_bool) # 返回 True
my_set1 = {"apple", "orange", "pear", "grape"}my_set2 = {"banana", "watermelon","apple"}
# 两个集合有相同元素ret_bool = my_set1.isdisjoint(my_set2)print(ret_bool)
复制代码


issubset 该方法用于判断一个集合是否是另一个集合的子集,确定是返回 True,否则返回 False。


my_set1 = {"apple", "orange", "pear", "grape"}my_set2 = {"banana", "watermelon"}
# 第二个集合不是第一个集合的子集ret_bool = my_set2.issubset(my_set1)print(ret_bool) # 返回 False
# 第二个集合是第一个集合的子集my_set1 = {"apple", "orange", "pear", "grape"}my_set2 = {"orange","apple"}
ret_bool = my_set2.issubset(my_set1)print(ret_bool) # 返回 True
复制代码


注意判断 A 是 B 的子集,格式是 A.issubset(B),顺序别搞错。


issuperset 方法用于判断一个集合是否是另一个集合的父集,与 issubset 恰好相反,具体实现由大家自行完成。


update 方法用于将一个集合的元素添加到另一个集合内,语法格式如下:


被添加的集合A.update(待添加的集合B)
复制代码


该方法谁在前就是给谁添加。


my_set1 = {"apple", "orange", "pear", "grape"}my_set2 = {"banana", "watermelon"}
my_set1.update(my_set2)print(my_set1)
复制代码


其它一些方法,本轮滚雪球阶段只做了解。


  • intersection_update 此方法用于求多个集合的交集

  • difference_update 删除集合内与另一集合重复的元素

  • symmetricdifferenceupdate 类似对称差集的用法


8.4 集合可用的内置函数


8.4.1 max、min、sum


以上内置函数作用域集合与列表使用规则一致,自行测试即可。


8.4.2 len


获取集合元素的数量。


8.4.3 sorted


使用该函数可以对集合进行排序。


8.5 冻结集合 frozenset


集合中的元素可以添加与删除,与列表可以对应。

还存在一种不可进行添加与删除元素的集合,叫做冻结集合,与元组可以对应学习。


冻结集合不做展开讲解,有兴趣的可以检索一些,不过我觉得这节课内容已经非常多啦。


8.6 这篇博客的总结


集合,一个无序且元素必须唯一的容器型数据类型,在橡皮擦的编程生涯中,集合经常用来去重,效率高、编写简单,值得掌握。


下篇博客开始,我们将进入 Python 函数的世界,难度要来了哦~


最后一碗毒鸡汤


当你学会破罐破摔 你会发现这世界豁然开朗 O(∩_∩)O 哈哈~


**想学 Python 爬虫,可以订阅橡皮擦专栏哦~** 💋💋💋 点击发现惊喜 💋💋💋


🍂🍂🍂🍂🍂🍂🍂




博主 ID:梦想橡皮擦,希望大家<font color="red">点赞</font>、<font color="red">评论</font>、<font color="red">收藏</font>。



发布于: 2021 年 02 月 13 日阅读数: 11
用户头像

爬虫 100 例作者,蓝桥签约作者,博客专家 2021.02.06 加入

6 年产品经理+教学经验,3 年互联网项目管理经验; 互联网资深爱好者; 沉迷各种技术无法自拔,导致年龄被困在 25 岁; CSDN 爬虫 100 例作者。 个人公众号“梦想橡皮擦”。

评论

发布
暂无评论
8. ㊙ Python 集合三板斧,滚雪球学 Python