[Python学习日记-19] 细讲数据类型——集合
简介
集合的创建
集合的增删查
集合的循环
集合的去重
集合的关系运算
简介
在前面我们学习到了列表、元组、字符串、字典这几种数据类型,在 Python 中还有最后一种数据类型,那就是集合,下面我们一起来看一下这种数据类型究竟是怎么回事吧
定义:集合跟我们学的列表有点像,也是可以存一堆数据,其是一种无序、可变且不重复的数据类型,不过它有几个独特的特点,令其在整个 Python 中占有一席之地
特性:
- 里面的元素不可变,代表你不能存一个 list、dict 在集合里,而字符串、数字、元组等不可变类型可以存
- 天生去重,在集合里没办法存重复的元素
- 无序,不像列表一样通过索引来标记在列表中的位置 ,元素是无序的,集合中的元素没有先后之分,例如集合 {3,4,5} 和 {3,5,4} 算作同一个集合
基于上面的特性,我们可以用集合来干2件事,一是去重,二是关系运算
集合的创建
下面我们先来学习一下集合是如何创建的,前面提到集合是没办法存重复的元素的,那我们通过代码来验证一下是否如此,代码如下
a = {1,2,3,4,2,"Jove",3,"rain","Jove"}
print(a)
代码输出如下:
由于它是天生去重的,重复的值根本存不进去
集合的增删查
在 Python 中,集合内存储的都是一些不可变的数据类型,例如字符串、数字、元组等,但是集合本身是一种可变的数据类型,可以执行增加、删除、修改和查询操作。
一、增
a = {1, 2, 3, 4, "rain", "Jove"}
a.add("Kerry")
a.add("Jove") # 加入了重复的元素不会有返回提示
a.add([1,2,3]) # 加入可变类型将会报错 ——> unhashable type (该类型无法被 hash)
代码输出如下:
从上面的代码输出可以看出集合是无序的,它并不像列表一样可以指定加载前面或者后面,位置完全随机,下面我们再加入一个“Kerry1”看看它这次又加到了那里了
这次又加到了中间位置,从现象可以看出集合真的是一个无序的数据集合
二、删
1、指定删除(discard)
a = {1, 2, 3, 4, "rain", "Jove"}
a.discard("rain") # 删除一个存在的值
a.discard("rain2") # 如果这个值不存在将不会有任何操作
代码输出如下:
2、指定删除(remove)
a = {1, 2, 3, 4, "rain", "Jove"}
a.remove("rain") # 删除一个存在的值和 discard() 相同
a.remove("rain2") # 与 discard() 不同的是,如果这个值不存在将会报错
代码输出如下:
3、随机删除(少用或特定场景使用)
a = {1, 2, 3, 4, "rain", "Jove"}
a.pop() # 删除并返回
代码输出如下:
在你实际操作时你会发现,它不是按顺序删的吗?其实不然,现在只不过是你数据量太少,当数据量上万或者几十万是它就是随机删的了
4、清空
a = {1, 2, 3, 4, "rain", "Jove"}
a.clear()
代码输出如下:
三、查
a = {1, 2, 3, 4, "rain", "Jove"}
print("Jove" in a)
代码输出如下:
注意:集合的切片也是不允许的,如果强行切片会报错
集合的循环
集合的循环和列表是一致的,如果熟悉列表的操作这个应该是得心应手的
a = {1, 2, 3, 4, "rain", "Jove"}
for i in a:
print(i)
代码输出如下:
集合的去重
帮列表去重最快速的办法是什么?就是把它转成集合,去重完,再转回列表来实现。代码如下
a = [1,2,3,4,2,"Jove",3,"rain","Jove"]
a = list(set(a)) # set() 就是将列表 a 强制转换为集合,一句代码搞定
代码输出如下:
集合的关系运算
我们来举个例子,有两门课程,一门是 py 另一门是 web,有的学生及学了 py 又学了 web 那我们怎么才可以把及学了 py 又学了 web 的学生都取出来呢?我们先看列表是如何实现的
py = ["张三","李四","王五","吴六","Jove","Kerry","Lucy"]
web = ["Jove","Mary","张飞","李四","Jack"]
both = []
for i in py:
if i in web:
both.append(i)
print(both)
代码输出如下:
可以看得出使用列表来实现相对复杂,而且要遍历两个列表,如果列表数据有上万条那么多那这个遍历过程将会相当漫长。其实关系运算有四种形式:交集、并集、差集、对称差集,而上面的就是交集,下面我们来看看集合是如何实现这四种形式的
一、集合的交集、并集、差集、对称差集
1、交集
交集只会把两个集合中都有的元素显示出来
py = {"张三","李四","王五","吴六","Jove","Kerry","Lucy"}
web = {"Jove","Mary","张飞","李四","Jack"}
print(py & web) # 交集,elements in both set
print(py.intersection(web))
print(py.intersection_update(web)) # 把结果赋值给 py
代码输出如下:
可以看得出使用集合来实现交集比用列表来实现简单高效得多
2、并集(合集)
并集会把两个集合加在一起,有多项相同的元素将会只留下一个
py = {"张三","李四","王五","吴六","Jove","Kerry","Lucy"}
web = {"Jove","Mary","张飞","李四","Jack"}
print(py | web) # 并集 or 合集
print(py.union(web))
print(py.update(web)) # 把结果赋值给 py
代码输出如下:
3、差集
差集会以前面一项为主显示
py = {"张三","李四","王五","吴六","Jove","Kerry","Lucy"}
web = {"Jove","Mary","张飞","李四","Jack"}
print(py - web) # 差集,only in py
print(py.difference(web))
print(py.difference_update(web)) # 把结果赋值给 py
print(web - py) # 差集,only in web
print(web.difference(py))
print(web.difference_update(py)) # 把结果赋值给 web
代码输出如下:
4、对称差集
对称差集会把两个集合里面都有的元素剔除掉
py = {"张三","李四","王五","吴六","Jove","Kerry","Lucy"}
web = {"Jove","Mary","张飞","李四","Jack"}
print(py ^ web) # 对称差集,把脚踏2只船的人踢出去
print(py.symmetric_difference(web))
print(py.symmetric_difference_update(web)) # 把结果赋值给 py
代码输出如下:
二、集合的关系判断
两个集合之间一般有三种关系,相交、包含、不相交
1、相交
相交是2个集合有相同的元素即为相交,否则为不相交
py = {"张三","李四","王五","吴六","Jove","Kerry","Lucy"}
web = {"Jove","Mary","张飞","李四","Jack"}
print(py.isdisjoint(web)) # 判断2个集合是不是不相交,返回 True 或 False
代码输出如下:
2、包含
包含是1个集合有另1个集合的全部元素
py = {"张三","李四","王五","吴六","Jove","Kerry","Lucy"}
web = {"Jove","Mary","张飞","李四","Jack"}
print(py.issubset(web)) # 判断 py 是不是 web 的子集,返回 True 或 False
代码输出如下:
3、不相交
不相交是2个集合没有1个元素相同
py = {"张三","李四","王五","吴六","Jove","Kerry","Lucy"}
web = {"Jove","Mary","张飞","李四","Jack"}
print(py.issuperset(web)) # 判断 py 是不是 web 的父集,返回 True 或 False
代码输出如下: