python 集合操作方法详解
说集合之前,我们先说一个小例子,假设某公司有五个人喜欢打篮球,五个人喜欢打游戏,问即打游戏有打篮球
的人都有哪些?
1 2 3 4 5 6 7 8 9 | play_basketball = [ 'a' , 'b' , 'c' , 'd' , 'e' ] play_game = [ 'a' , 'b' , 'c' , 'f' , 'g' ] both_play = [] for name in play_basketball: if name in play_game: both_play.append(name) print (both_play) 结果: [ 'a' , 'b' , 'c' ] |
在不了解集合之前我们肯定以上面的方法解决问题,但是学了集合之后,我们就有更简单的方法了,是什么呢?让我们慢慢了解。
集合set
集合用于包含一组无序的对象。与列表和元组不同,集合是无序的,也无法通过数字进行索引。此外,集合中的元素不能重复。set和dict一样,只是没有value,相当于dict的key集合,由于dict的key是不重复的,且key是不可变对象因此set也有如下特性:
- 不重复,(互异性),也就是说集合是天生去重的
- 元素为不可变对象,(确定性,元素必须可hash)
- 集合的元素没有先后之分,(无序性)
首先笼统的讲一下python3.x集合的内置函数有17个,分别如下:
序号 | 函数 | 描述 |
1 |
add(self, *args, **kwargs) |
是把要传入的元素做为一个整个添加到集合中 |
2 |
clear(self, *args, **kwargs) |
清空集合里面的所有元素 |
3 |
copy(self, *args, **kwargs) |
复制集合里面的所有元素 ,返回一个浅复制 |
4 |
difference(self, *args, **kwargs) |
求两个集合里面的不同的元素 ,又称差 |
5 |
difference_update(self, *args, **kwargs) |
返回删除了 set “集合2”中含有的元素后的 set “集合1” |
6 |
discard(self, *args, **kwargs) |
如果在 set “集合”中存在元素 x, 则删除 |
7 |
intersection(self, *args, **kwargs) |
求两个集合里面相同的元素,又称并 , 返回只保留含有 set “集合2”中元素的 set “集合1” |
8 |
intersection_update(self, *args, **kwargs) |
,
返回只保留含有 set “集合2”中元素的 set “集合1” ,并更新自己 |
9 |
isdisjoint(self, *args, **kwargs) |
判断两个集合是不是不相交,并返回 |
10 |
issubset(self, *args, **kwargs) |
判断集合是不是包含其他集合,等同于a>=b |
11 |
issuperset(self, *args, **kwargs) |
判断集合是不是被其他集合包含,等同于a<=b |
12 |
pop(self, *args, **kwargs) |
删除并且返回 set “集合”中的一个不确定的元素, 如果为空则引发 KeyError |
13 |
remove(self, *args, **kwargs) |
从 set “集合”中删除元素 , 如果不存在则引发 KeyError |
14 |
symmetric_difference(self, *args, **kwargs) |
返回一个新的 set 包含 外面 和 里面 中不重复的元素 也就是两个集合不重复的元素 |
15 |
symmetric_difference_update(self, *args, **kwargs) |
返回含有 set “里面”或者 set “外面”中有而不是两者都有的元素的 set “外面” |
16 |
union(self, *args, **kwargs) |
把两个集合连接起来,又称并 |
17 |
update(self, *args, **kwargs) |
可以在集合里面添加多项 |
1,定义集合
1 2 3 4 5 6 | #第一种方法 nums = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 ] num_set = set (nums) print (num_set) 结果: { 1 , 2 , 3 , 4 , 5 , 6 , 7 }<br><br> #第二种方法<br>num_set ={1,2,3,4,5,6,7} |
2,增(更新)
set.add()
set.update([])
1 2 3 4 5 6 7 8 9 10 11 | nums = { 1 , 2 , 3 , 4 , 5 , 6 , 7 } #set.add()增加只能增加一个,不能增加多个值 # nums.add(8) # print(nums) #set.update()可以增加一个字符串,可以增加多个值 # nums.update([8]) # print(nums) # nums.update('8') # print(nums) nums.update([ 8 , 9 , 10 ]) print (nums) |
3,删
set1.remove(1)
1 2 3 4 5 | nums = { 1 , 2 , 3 , 4 , 5 , 6 , 7 } nums.remove( 7 ) print (nums) 结果: { 1 , 2 , 3 , 4 , 5 , 6 } |
4,查:无法通过下标索引
5,改:不可变类型无法修改元素
6,交( &)
1 2 3 4 5 6 7 8 9 10 11 12 | nums1 = { 1 , 2 , 3 , 4 , 5 , 6 } nums2 = { 1 , 2 , 3 , 4 , 5 , 10 , 7 , 8 , 9 } #交的方式一:& a = nums1&nums2 print (a) #并的方式二:intersaction b = nums1.intersection(nums2) print (b) 结果: { 1 , 2 , 3 , 4 , 5 } { 1 , 2 , 3 , 4 , 5 } |
7,并(|)
1 2 3 4 5 6 7 8 9 10 11 12 | nums1 = { 1 , 2 , 3 , 4 , 5 , 6 } nums2 = { 1 , 2 , 3 , 4 , 5 , 10 , 7 , 8 , 9 } #并的方式一:| a = nums1|nums2 print (a) #并的方式二:uniom b = nums1.union(nums2) print (b) 结果: { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 } { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 } |
8,差(-)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | nums1 = { 1 , 2 , 3 , 4 , 5 , 6 } nums2 = { 1 , 2 , 3 , 4 , 5 , 10 , 7 , 8 , 9 } #差的方式一:- a1 = nums1 - nums2 print (a1) a2 = nums2 - nums1 print (a2) #差的方式二:difference b1 = nums1.difference(nums2) print (b1) b2 = nums2.difference(nums1) print (b2) 结果: { 6 } { 8 , 9 , 10 , 7 } { 6 } { 8 , 9 , 10 , 7 } |
9,对称差集(^)
1 2 3 4 5 6 7 8 9 10 11 12 | nums1 = { 1 , 2 , 3 , 4 , 5 , 6 } nums2 = { 1 , 2 , 3 , 4 , 5 , 10 , 7 , 8 , 9 } #对称差集表示方法一:^ a1 = nums1^nums2 print (a1) #对称差集表示方法二:symmetric_difference a2 = nums2.symmetric_difference(nums1) print (a2) 结果: { 6 , 7 , 8 , 9 , 10 } { 6 , 7 , 8 , 9 , 10 } |
10,集合转换
1 2 3 4 5 6 7 8 9 10 11 12 | se = set ( range ( 4 )) li = list (se) tu = tuple (se) st = str (se) print (li, type (li)) print (tu, type (tu)) print (st, type (st)) 结果: [ 0 , 1 , 2 , 3 ] < class 'list' > ( 0 , 1 , 2 , 3 ) < class 'tuple' > { 0 , 1 , 2 , 3 } < class 'str' > |
补充:frozenset
冰冻集合,是一种特殊的集合类型,也是集合(集合是列表的话,冰冻集合就是元组)
下面创建冰冻集合(一般不会创建空的冰冻集合)
同时下面包含函数的补充
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #创建带数据的冰冻集合 info = frozenset (( 'xuexi' , 'gongzuo' , 'kaoyan' , 'xiuxi' )) print (info, type (info)) #成员监测 result = 'gongzuo' in info print (result) #遍历冰冻集合 for i in info: print (i) #集合推导式(无法得到冰冻集合,可以得到集合,列表,元组,字典类型) result = {i for i in info} print (result, type (result)) #函数 #冰冻集合可以使用集合的函数(不修改集合本身的函数都可以使用) info = frozenset (( 'xuexi' , 'gongzuo' , 'kaoyan' , 'xiuxi' )) #copy() result = info.copy() print (result) #集合操作 交集,并集,差集,对称差集等 不修改冰冻集合本身就能使用:冰冻集合的操作结果都是冰冻集合 info = frozenset (( 'xuexi' , 'gongzuo' , 'kaoyan' , 'xiuxi' )) info2 = { 'xuexi' , 'gongzuo' , 'kaoyan' , 'xiuxi' } #冰冻集合操作 result = info.union(info2) print (result) #普通集合操作(冰冻集合是参考集合) result = info2.union(info) print (result) |
字符串操作方法详解,请看下面博客:http://www.cnblogs.com/wj-1314/p/8419009.html
字典操作方法详解,请看下面博客:http://www.cnblogs.com/wj-1314/p/8421724.html
列表操作方法详解,请看下面博客:http://www.cnblogs.com/wj-1314/p/8433116.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步