python3数据类型–集合

avatar 2020年3月1日18:15:27 评论 1,126 次浏览

集合的标志也是{},不过在创建集合时,不能直接使用{},要不会创建成字典,如果想创建空集合必须使用set()。集合元素具有唯一性,不允许重复。集合分为可变集合和不可变集合,可变集合函数set(),不可变集合frozenset(),同样集合也不支持索引,所以我们在处理集合时,不能使用索引。看下面的例子:

#!/usr/bin/python3
#coding:utf-8
#~~~~~~~~~~~~www.wulaoer.org 吴老二个人博客~~~~~~~
wulaoer = {"python3","Ruby","Golong"}
wulaoer1 = set()
print("使用{}创建字典",type(wulaoer))
print("使用set()创建空字典",type(wulaoer1))

输出结果:

使用{}创建字典 <class 'set'>
使用set()创建空字典 <class 'set'>

集合也有很多内置函数,下面我们也根据增删操作举个例子,下面是增的操作:

#!/usr/bin/python3
#coding:utf-8
#~~~~~~~~~~~~www.wulaoer.org 吴老二个人博客~~~~~~~
wulaoer = {"python3","Ruby","Golong"}
wulaoer.add("Java") #增加之后不可继续增加,因为集合具有唯一性
print("通过add增加一个集合元素Java",wulaoer)
wulaoer.update({"运维服务"})
print("通过update增加集合{\"运维服务\"}",wulaoer)   #这里使用的"\"是转义符
wulaoer.update("12")
print("update增加字符串",wulaoer) 

输出结果:

通过add增加一个集合元素Java {'Golong', 'Ruby', 'python3', 'Java'}
通过update增加集合{"运维服务"} {'Java', 'Ruby', 'python3', '运维服务', 'Golong'}
update增加字符串 {'Java', 'Ruby', 'python3', '运维服务', '2', 'Golong', '1'}

使用了两个内置函数add()和update(),两者的区别是update()增加的是一个集合,如果增加的元素不以集合的方式添加会把增加的字符串当成多个元素,而add()增加的是一个元素。这里我们可以测试一下集合的唯一性,如果我们使用add()内置函数增加了一个元素"Java",如果再使用update()内置函数在增加一个集合"{"Java"}"这个时候你打印wulaoer,你会发现,集合wulaoer中还是只有一个元素"Java",这就是集合的唯一性。这里就不举例了,如果有兴趣的同学可以自己测试一下。另外如果对不可变集合增加元素,会报错"AttributeError: 'frozenset' object has no attribute 'add'",所以针对不可变集合不能进行增删改查操作,有兴趣的也可以自己试一下。

集合不支持索引,下面可以测试一下根据索引打印集合中的一个元素,返回错误

  File "file:set.py", line 35, in <module>
	print(wulaoer[1])
TypeError: 'set' object does not support indexing

提示错误,不支持索引。

set的删

元组的删操作有多中,例如针对单个元素删除元素,两个元组做对比返回相同的元素或者不同的元素。这里就先不说两个集合的对比,说完集合的增删改查,针对两个集合的对比单独在说。集合的删使用到函数pop(),remove(),clear(),pop()函数是随机删除一个集合中的任意一个元素,remove()是删除集合中的一个自定元素,而clear()是删除整个集合的所有元素,并返回None

#!/usr/bin/python3
#coding:utf-8
#~~~~~~~~~~~~www.wulaoer.org 吴老二个人博客~~~~~~~
wulaoer = {"python3","Ruby","Golong","运维服务","运维开发"}
print("随机删除集合中一个元素",wulaoer.pop())   #随机删除一个元素
wulaoer.remove("Ruby") #删除指定元素,不指定会或者不存在报错
print("使用remove()内置函数删除集合中指定的元素",wulaoer)
print(wulaoer.discard("运维开发")) #删除指定元素,不指定或者不存在会报错
wulaoer.clear() #删除集合中所有元素,返回none
print("使用内置函数clear()删除所有元素",wulaoer)

输出结果:

随机删除集合中一个元素 运维服务
使用remove()内置函数删除集合中指定的元素 {'运维开发', 'Golong', 'python3'}
None
使用内置函数clear()删除所有元素 set()

针对集合的删操作只有这三个函数。可变集合只能动态的增加和删除,不能修改,如果非要修改只能利用remove()函数删除指定的元素,然后在根据增加函数增加一个函数,勉强算是修改函数。集合不支持索引,所以查看集合不能利用索引进行切片,也不能根据索引返回元素,如果我们一定要看集合中的元素可以使用for玄幻进行遍历集合,

set的改

集合并不支持索引,所以我们没有办法修改到集合中的一个指定元素,不过我们根据根据上面的删除集合中的指定元素,删除掉元素,然后在根据集合的增方法增加一个集合元素,这种方法虽然有点笨,但也不失一种方法。

set的内置函数

集合除了以上说的内置函数外,还有一些其他的内置函数,下面对集合的其他内置函数的使用方法举例说明一下:

集合的交集函数,intersection(),intersection_update(),两者都是获取至少两个以上集合中重复的元素,即集合的交集两者的区别是一个是生成新的集合一个是在原集合的基础上去除不重复的元素,下面看看两个内置函数的例子:

#!/usr/bin/python3
#coding:utf-8
#~~~~~~~~~~~~www.wulaoer.org 吴老二个人博客~~~~~~~
wulaoer = {"python3","Ruby","Golong","运维服务","运维开发"}
wolf={"python3","Ruby"}
wolf1 = {"python3","运维服务"}
sets = wulaoer.intersection(wolf,wolf1)
print("使用内置函数intersection()不修改原集合",wulaoer)
wulaoer.intersection_update(wolf)
print("使用内置函数intersection_update()修改原集合",wulaoer)
print("生成的新的集合",sets)

输出结果:

使用内置函数intersection()不修改原集合 {'Golong', 'Ruby', 'python3', '运维服务', '运维开发'}
使用内置函数intersection_update()修改原集合 {'Ruby', 'python3'}
生成的新的集合 {'python3'}

这是返回两个集合中相同元素,那么返回两个集合中不同的元素又该如何操作呢?看看symmetric_difference()和symmetric_difference_update()函数,两者的区别和上面一样,一个是生成新的集合,一个是在原集合的基础上进行去除后在插入,这里需要注意,symmetric_difference()和symmetric_difference_update()函数是只能对比一个集合,不能对比多个集合,看下面的例子:

#!/usr/bin/python3
#coding:utf-8
#~~~~~~~~~~~~www.wulaoer.org 吴老二个人博客~~~~~~~
wulaoer = {"python3","Ruby","Golong","运维服务","运维开发"}
wolf={"python3","Ruby","Java"}
wolf1 = {"python3","运维服务","C++"}
sets=wulaoer.symmetric_difference(wolf)
print("使用内置函数symmetric_difference()不修改原集合",sets)
wulaoer.symmetric_difference_update(wolf1)
print("使用内置函数symmetric_difference_update()修改原集合",wulaoer)

输出结果:

使用内置函数symmetric_difference()不修改原集合 {'Java', 'Golong', '运维服务', '运维开发'}
使用内置函数symmetric_difference_update()修改原集合 {'Ruby', 'C++', 'Golong', '运维开发'}

以上是针对集合的交集内置函数,既然有交集也会有子集,子集的意思就是包含与被包含的意思。举个例子:A集合中包含元素1至9,而B集合中只有1和2,那么B集合就是A集合的子集,A包含于B,B被A包含的关系。同样如果有一个C集合元素为3和3,那么C集合也是A的子集。在Python中找到集合的子集可以使用内置函数intersection()和intersection_update(),但是判断一个集合是否是另一个集合的子集又该如何判断呢?python中提供了内置函数issubset(),对比两个集合中如果有相同元素则返回True,否则返回False

#!/usr/bin/python3
#coding:utf-8
#~~~~~~~~~~~~www.wulaoer.org 吴老二个人博客~~~~~~~
wulaoer = {"python3","Ruby","Golong","运维服务","运维开发"}
wolf={"python3","Ruby"}
wolf1 = {"python3","Ruby","C++"}
sets = wolf.issubset(wulaoer)
print("判断集合wolf被wulaoer包含:",sets)
sets1 = wolf1.issubset(wulaoer)
print("判断集合wolf1被wulaoer包含:",sets1)

输出结果:

判断集合wolf被wulaoer包含: True
判断集合wolf1被wulaoer包含: False

这里的集合是被包含子集中所有元素,那么包含集合中所有元素又该如何判断呢?看一下内置函数issuperset(),先看看例子:

#!/usr/bin/python3
#coding:utf-8
#~~~~~~~~~~~~www.wulaoer.org 吴老二个人博客~~~~~~~
wulaoer = {"python3","Ruby","Golong","运维服务","运维开发"}
wolf={"python3","Ruby",}
wolf1 = {"python3","Ruby","C++"}
sets = wulaoer.issuperset(wolf)
print("集合wulaoer包含于wolf:",sets)
set1 = wulaoer.issuperset(wolf1)
print("集合wulaoer包含于wolf:",set1)

输出结果:

集合wulaoer包含于wolf: True
集合wulaoer包含于wolf: False

两者的区别是包含于被包含的关系,要分清前后的区别。

内置函数isdisjoint(),内置函数是否包含相同元素,如果没有相同元素返回True,否则返回False,注:这里没有包含关系。

#!/usr/bin/python3
#coding:utf-8
#~~~~~~~~~~~~www.wulaoer.org 吴老二个人博客~~~~~~~
wulaoer = {"python3","Ruby","Golong","运维服务","运维开发"}
wolf={"python3","Ruby"}
wolf1 = {"运维监控","DevOps","C++"}
set1 = wulaoer.isdisjoint(wolf)
print("对比集合wulaoer和wolf,有相同的元素:",set1)
sets = wulaoer.isdisjoint(wolf1)
print("对比集合wulaoer和wolf1,没有相同的元素:",sets)

输出结果:

对比集合wulaoer和wolf,有相同的元素: False
对比集合wulaoer和wolf1,没有相同的元素: True

最后一个集合的并集,并集的意思就是两个集合合并为一个集合,然后去掉相同的元素组成一个新的集合,union()函数就是处理集合的并集的,看一下例子:

#!/usr/bin/python3
#coding:utf-8
#~~~~~~~~~~~~www.wulaoer.org 吴老二个人博客~~~~~~~
wulaoer = {"python3","Ruby","Golong","运维服务","运维开发"}
wolf={"python3","Ruby","Java"}
wolf1 = {"python3","DevOps","C++"}
sets = wulaoer.union(wolf,wolf1)
print("wulaoer和wolf的并集:",sets)

输出结果:

wulaoer和wolf的并集: {'运维服务', 'Golong', 'Java', 'python3', 'C++', 'DevOps', '运维开发', 'Ruby'}

集合的基本操作以及相关的内置函数的使用已经介绍完了。

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: