什么是集合set?
集合(set)是一个无序的不重复元素序列。基本功能包括关系测试和消除重复元素。集合成员可以做字典中的键。
因为集合对象是一组无序排列的可哈希的值,所以不可以为集合创建索引或执行切片(slice)操作,也没有键(keys)可用来获取集合中元素的值。
集合可以看做没有value的字典的key集合,由于字典的key是不重复的,且key是不可变对象因此set也有特性:
- 不重复
- 元素为不可变对象
为什么用集合set?
集合支持用in和not in操作符检查成员,由len()内建函数得到集合的基数(大小), 用 for 循环迭代集合的成员。 集合对象还支持union(联合), intersection(交), difference(差)和sysmmetric difference(对称差集)等数学运算。
利用集合的特性可以测试关系和消除重复元素。
如何使用集合?
创建集合
可以使用大括号{ }或者set()函数创建集合,注意:创建一个空集合必须用set()而不是{ },因为{ }是用来创建一个空字典。
>>> set1 = {1,2,3}
>>> type(set1)
<class 'set'>
>>> set2 = set('abc')
>>> set2
{'c', 'b', 'a'}
>>> set3 = set([1,2,3,'a'])
>>> set3
{1, 2, 3, 'a'}
# 创建空集合不能用{},这样创建出的是空字典
>>> s = {}
>>> type(s)
<class 'dict'>
# 创建空集合用set()
>>> s = set()
>>> type(s)
<class 'set'>
集合的增删
添加元素
# 增加1项元素 set().add()
>>> set1 = set((1,2,3,4))
>>> set1
{1, 2, 3, 4}
>>> set1.add(5)
>>> set1
{1, 2, 3, 4, 5}
# 增加多项元素 set().update()
>>> set2 = {1,2,3}
>>> set2.update(['a','b'])
>>> set2
{1, 2, 3, 'a', 'b'}
>>> set3 = {4,5,6}
>>> a = {'a':1,'b':2}
>>> set3.update(a)
>>> set3
{4, 5, 6, 'b', 'a'} # 增加元素是字典的话,只会添加字典的key
>>> set4 = {1,2,3}
>>> set4.update((4,5,6)) # 元组的表现同列表
>>> set4
{1, 2, 3, 4, 5, 6}
# 列表不能hash,所以不能添加进集合,字典和集合本身也不行哦!
>>> set1 = set((1,2,3,4))
>>> set1
{1, 2, 3, 4}
>>> set1.add([5,6])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
元组可以hash,所以可以添加进集合
>>> hash((5,6))
3713085962043070856
>>> set1 = set((1,2,3,4))
>>> set1
{1, 2, 3, 4}
>>> set1.add((5,6))
>>> set1
{1, 2, 3, 4, (5, 6)}
# 复制一个集合 set().copy()
>>> s = {5,6,7}
>>> t = s.copy()
>>> t
{5, 6, 7}
移除元素
# 删除元素 set().remove()
>>> set1 = {1,2,3}
>>> set1
{1, 2, 3}
>>> set1.remove(1)
>>> set1
{2, 3}
# 删除元素 set().discard()
>>> set1 = {1,2,3}
>>> set1
{1, 2, 3}
>>> set1.discard(3)
>>> set1
{1, 2}
# remove和discard区别:remove删除一个不存在于集合中的元素是会报错,discard不会。
>>> set1 = {1,2,3}
>>> set1.remove(4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 4
>>> set1.discard(4)
>>>
# 排序后删除集合中的一个元素 set().pop()
# 集合会对元素进行排列,pop方法将这个排列集合的左面第一个元素进行删除。
>>> set1 = {4,3,0,1,2}
>>> set1
{0, 1, 2, 3, 4}
>>> set1.pop()
0
>>> set1.pop()
1
>>> set1
{2, 3, 4}
>>> set1 = {1,3,0,'A','a','c','b'}
>>> set1
{0, 1, 3, 'A', 'a', 'c', 'b'}
>>> set1.pop()
0
>>> set1.pop()
1
>>> set1.pop()
3
>>> set1.pop()
'A'
>>> set1
{'a', 'c', 'b'}
# 清空集合 set().clear()
>>> set1
{'a', 'c', 'b'}
>>> set1.clear()
>>> set1
set()
集合的一些操作和计算
>>> s = {1,2,3,4,5}
>>> t = {1,3,5}
# 集合的长度
>>> len(s)
5
# 并集、交集、差集和对称差集
# s和t的并集
>>> s | t
{1, 2, 3, 4, 5}
>>> s.union(t)
{1, 2, 3, 4, 5}
>>> t |= s #t和s的并集,并直接赋值给t
>>> t
{1, 2, 3, 4, 5}
# s和t的交集
>>> s & t
{1, 3, 5}
>>> s.intersection(t)
{1, 3, 5}
>>> s &= t #s和t的交集并直接赋值给s
>>> s
{1, 3, 5}
# s和t的差集
>>> s - t # 在s中,但不在t中。
{2, 4}
>>> s.difference(t)
{2, 4}
>>> s -= t #s和t的差集,直接赋值给s
>>> s
{2, 4}
# s和t的对称差集
>>> s ^ t # 在s或t中,但不会同时出现在二者中
{2, 4}
>>> s.symmetric_difference(t)
{2, 4}
>>> s ^= t # s和t的对称差集,直接赋值给s
>>> s
{2, 4}
# 子集判断
>>> s <= t # 判断s是否为t的子集,s中的元素是否都在t中
False
>>> t <= s # 判断t是否为s的子集,t中的元素是否都在s中
True
>>> t.issubset(s)
True
# 全集判断
>>> s >= t # 判断s是否是t的全集,s包含t的所有元素
True
>>> s.issuperset(t)
True
其他操作,用做多的就是去重和排序
# 去重排序
>>> s = [1,2,3,4,5,2,3,2,1]
>>> set(s)
{1, 2, 3, 4, 5}
>>> set('ccooppyy')
{'c', 'o', 'y', 'p'}
可以去阿里云开一个云主机,做做练习哦~
优惠上云,来阿里云·云小站www.aliyun.com![319d90ebb2d5dd577e73ec12ee358b25.png](https://i-blog.csdnimg.cn/blog_migrate/bdbb83e4ca61a0d7c12a1a509ccab5bc.png)