Python集合

集合是一个无序的不重复的元素序列,这与C++中的set容器有一点点像,在Python这里成了基本数据类型了;

一.创建集合

1.空集合

用{}或者set()函数都可以创建一个集合,不过这里要注意在创建一个空集合时不能用{},因为{}表示的是空字典,所以只能用set()表示一个空集合:

a = set()
b = {}
print(type(a))
print(type(b))
#输出:
<class 'set'>
<class 'dict'>

2.集合解析式

集合解析式和列表解析式是一样的,举个例子:

number = [1,2,3,4,5,6,7,8,9]
a = {value for value in number if value%2==0}
print(a)
#输出:
{8, 2, 4, 6}

可以看到,输出的是8,2,4,6,这也说明了集合内部是无序的这一特性;

二.集合相关操作

1.添加、移除元素

嗯?怎么没有访问?
还想着访问呢?既然集合是无序的,那么通过索引对集合内单个元素的访问肯定也是不被支持的,Python不支持通过索引对集合元素的访问;

添加:
1.1 利用方法add()向集合内添加元素,这里注意,因为集合要时刻保持其内部的无重复性,因此是不能添加可变数据的,万一添加一个可变的进去它有事没事变一下子可咋办?万一变得和集合内其它元素一样了那这集合岂不就名不副实了,所以利用add()方法添加的对象只能是不可变的数值、字符串、元组或者布尔型,如果试图添加列表、字典等可变值就会报错;

a = {1,2,3}
a.add(4)
print(a)# {1, 2, 3, 4}

1.2 如果你实在要添加一个列表进去,嘛也不是不可以,这时就需要我们的update()方法登场了,update()里面的参数可以是任何值,起初我还不太相信,就把所有类型都试了一遍,然后发现,update()果然是个狠角色…
通过update()方法,你可以添加包括集合、列表、字典在内的各种数据类型,尽管我也不明白为啥说了集合中不能加入可变数据但还是能用update()添加,但管它那么多,用就是了,百度了一下没有结果,所以这个疑问先遗留一下;
只不过在使用update()添加字典时要注意,添加进去的只有字典的键,这个已经经过我的实验验证,可以再看一个例子:

dict = {'a':7,6:'f'}
a = {1,2,3}
a.update(dict)
print(a)# {1, 2, 3, 'a', 6}

可以看到只有键被添加进了集合中,这也难怪,字典中的键本来就要求不可变且不重复,放在set里面简直浑然天成;

移除:
a.利用remove()方法移除要注意一点,如果要移除的元素在集合内不存在,那么就会发生错误;
b.discard()方法与remove()差不多,唯一的区别在于待移除元素在集合内不存在时,discard()什么都不会抛出;
c.也可以用pop()随机删除集合内元素,这就比较刺激了吧,其实这里和字典中的一样,pop()删除的还是底部元素,只不过集合是无序的,也就达到一种随机效果了;

2.交集、并集、差集

既然集合自动去重,那么就可以完成交集、并集以及差集的运算:

交集:

a = {1,2,3}
b = {3,4,5}
print(a&b)# {3}

并集:

a = {1,2,3}
b = {3,4,5}
print(a|b)# {1, 2, 3, 4, 5}

差集:

a = {1,2,3}
b = {3,4,5}
print(a-b)# {1, 2}
print(b-a)# {4, 5}

对称差集:

a = {1,2,3}
b = {3,4,5}
print(a^b)# {1, 2, 4, 5}

交集与并集我就不多说了,对于两个集合A、B,集合A减去A、B的交集的结果就是A-B的结果,也叫做A-B的差集,A与B的并集减去A与B的交集叫做A与B的对称差集;

三.有关集合的常用方法

add()	:
clear()	:
copy()	:
remove():
discard():
pop()	:
update():

以上这些就不说了;

difference():返回多个集合的差集,对,多个集合,所以3个以上也没问题:

a = {1,2,3,4,5,6,7,8}
b = {3,4,5}
c = {5,6,7}
d = a.difference(b,c)
print(d)# {1, 2, 8}

如上,3,4,5,6,7被减去,a.difference(b)就是a-b,顺序不要记差了;

union() :返回多个集合的并集:

a = {1,2,3}
b = {3,4,5}
c = {5,6,7}
d = a.union(b,c)
print(d) #{1,2,3,4,5,6,7}

intersection():返回多个集合的交集,例子就不说了吧,都是一样的;

symmetric_difference():返回多个集合的对称差集;

以上四个方法刚好是集合的四种操作,且它们返回的都是一个新集合;

以下三种与以上对应的几种功能基本一致,不过下面三种不返回新集合,它们在原集合上操作:

difference_update();

intersection_update();

symmetric_difference_update();

注意没有union_update()!

isdisjoint():判断两个集合是否没有交集,有交集返回False,没有返回True,注意这个可不能判断多集合,只能用于判断两个集合;

set1.issubset(set2):判断set1是否是set2的子集;

set1.issuperset(set2):判断set2是否是set1的子集;

四.创建一个frozenset

你可以把它拆开来看,frozen意为冻结,集合被冻结?不难猜到,frozenset是用来创建一个不可变集合的,创建一个frozenset之后,原先set里面任何能够对set进行修改的方法对frozenset均不适用,frozenset支持的方法有:

['copy', 'difference', 'intersection', 'isdisjoint', 'issubset', 'issuperset', 'symmetric_difference', 'union']

以上这些方法的用法与set中的一样,不再介绍;

部分内容(不限于本文)参考自:

菜鸟编程
廖雪峰的官方网站
c语言中文网
以及《Python编程-从入门到实践》

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值