集合又是何方神圣?集合也是一个容器类的数据类型。但是有了列表和元组怎么又出现了一个集合?
介绍一下集合的特点:
集合是一个可变容器,就是支持里面元素的变化
集合内的数据对象都是唯一的(不能重复)
集合是无序的存储结构,集合内的数据没有先后关系
集合是可迭代对象
集合的底层是字典结构
集合到底长成啥样子呢?定义方式:
空集合:set1 = set()
有元素的集合:set1 ={'足球','篮球','网球','乒乓球','排球' }
可以发现符号发生了变化,再次与列表和元组一起对比学习下:
名称 | 符号 | 空元素 | 数据类型 | 是否可改(增加、删除、修改) | 是否允许重复 | 是否支持索引 | 符号支持 |
---|---|---|---|---|---|---|---|
列表 | [ ]方括号 | list1=[] | <class 'list'> | 可以 | 允许 | 支持 | + * in |
元组 | ()小括号 | tuple1=() | <class 'tuple'> | 不可以 | 允许 | 支持 | + * in |
集合 | {}大括号 | set1=set() | <class 'set'> | 可以 | 不允许 | 不支持 | &|-^in |
sports ={'足球','篮球','网球','乒乓球','排球','篮球','网球' }
print(type(sports))
print(len(sports)) #同样适用len()获取长度
print(sports) # 注意里面只有一个篮球和网球,即不允许重复元素
集合操作:
注意:因为不支持索引,所以索引相关的操作是不存在的。但是集合可以求交集、并集、差集、交叉补集
添加元素: set.add()
add():向集合内增加元素,如果添加的元素已经存在的话,则不执行任何操作
sports ={'足球','篮球','网球','乒乓球','排球','篮球','网球' }
sports.add('冰球')
print(sports)
sports.add('篮球')
print(sports)
删除集合元素:set.pop() 与 set.remove()
pop(): pop会从集合中随机删除一个数
remove(): 删除指定元素,如果是不存在的元素会报错。
discard(): 与remove()类似,如果是不存在的元素不会报错。
sports ={'足球','篮球','网球','乒乓球','排球','篮球','网球' }
sports.pop() # pop会从集合中随机删除一个数
print(sports)
sports.remove('篮球')
print(sports)
sports.remove('冰球')
print(sports)
集合的运算操作
交集: 交集可以使用符号:【&】完成。跟数学中的交集是一样的,就是求两个集合中共同都有的元素
sports1 ={'足球','篮球','网球','乒乓球'}
sports2= {'乒乓球','排球','篮球','网球','冰球'}
print(sports1&sports2)
结果:
{'篮球', '乒乓球', '网球'}
并集:并集可以使用符号:【|】完成,就是将两个集合并在一起。
sports1 ={'足球','篮球','网球','乒乓球'}
sports2= {'乒乓球','排球','篮球','网球','冰球'}
print(sports1|sports2)
结果:
{'冰球', '篮球', '网球', '足球', '排球', '乒乓球'}
差集:差集使用符号:【-】完成,就是求当前与另一个集合不同的。
sports1 ={'足球','篮球','网球','乒乓球'}
sports2= {'乒乓球','排球','篮球','网球','冰球'}
print(sports1-sports2) # 就是求sports1与sports2不同的是
结果:
{'足球'}
交叉补集:
理解下交叉补集:集合A 是{1、2、3 },集合B 是 {2、3、4 } . 交叉补集就只保留 1 和 4 。因为 1 是 A 独有的, 4 是B 独有的。交叉补集会去掉共有的部分,只保留双方独有的部分。
现在我们求sports1和sports2的交叉补集,使用符号是:【^】完成。
sports1 ={'足球','篮球','网球','乒乓球'}
sports2= {'乒乓球','排球','篮球','网球','冰球'}
print(sports1^sports2)
结果:
{'冰球', '足球', '排球'}
当然每个符号也有对应的集合函数。
符号 | 函数 |
---|---|
& | set1.intersection(set2)求set1和set2的交集 |
| | set1.union(set2) 求set1和set2的并集 |
- | set1.difference(set2) 求set1和set2的差集 |
^ | set1.symmetric_difference(set2) 求set1和set2的交叉补集 |