Python攻克之路-集合(set)
集合:把不同的元素组成一起形成集合,是Python基本的数据类型
两大作用:
a.去重
b.关系测试
1.去重
注:集合元素:组成集合的成员不可重复
In [9]: s=set('reid liu') In [10]: print(s) {'u', 'i', 'l', 'e', ' ', 'r', 'd'} ##如果有重复,只会保留一个,所以重要作用是去重
把列表去重
In [11]: s1=['reid','lucy','lucy','lucy'] In [12]: print(set(s1)) {'reid', 'lucy'} In [13]: type(set(s1)) Out[13]: set
去重后转换成列表
In [14]: s1=['reid','lucy','lucy','lucy'] In [15]: list(set(s1)) Out[15]: ['reid', 'lucy']
2.集合的特征
集合对象是一组无序排列的可哈希的值,集合成员可以做字典的键
可哈希:字典的key,必须是一个不可变类型,可以是整型,字符串,就能是列表和元组
In [16]: num=[[1,2],4,'reid'] In [17]: set(num) TypeError: unhashable type: 'list' #列表不可哈希
集合是无序
描述:它没有键,也没有索引,要取值只能通过for循环和迭代器来实现
集合分类:可变集合和不可变集合
可变集合(set):可添加和删除元素,set整体非可哈希的,不能用作字典的键,也不能做其他集合元素
不可变集合(frozenset): 与上面相反,不能添加修改集合,类似于list和tuple
In [18]: wu=[1,'a','b'] In [20]: s=set(wu) In [21]: dic={s:'123'} ##set整体是非可哈希的,意味着不s不能作为字典的键 TypeError: unhashable type: 'set'
3.集合的相关操作
a.创建集合
由于集合没有自己的语法格式,只能通过集合的工厂方法set()和frozenset()创建
In [1]: s1=set('reid') In [2]: s2=frozenset('liu') In [3]: print(s1,type(s1)) {'e', 'd', 'r', 'i'} <class 'set'> In [4]: print(s2,type(s2)) frozenset({'u', 'l', 'i'}) <class 'frozenset'>
b.访问集合
由于集合本身是无序的,所以不能为集合创建索引或切片操作,只能循环遍历或使用用in、not in来访问或判断集合元素
In [5]: s1=set('reid') In [6]: print('r' in s1) True In [7]: print('b' in s1) False
作为一个整体判断
In [11]: l1=[1,2,'reid'] In [12]: s=set(l1) In [13]: print('rei' in s) False
不能切片
In [8]: s1[1] TypeError: 'set' object does not support indexing #
可以循环打印
In [9]: for i in s1: ...: print(i) ...: e d r i
c.更新集合相关操作
add添加一个元素
In [14]: l1=[1,2,'reid'] In [15]: s=set(l1) In [16]: s.add('u') In [17]: print(s) {1, 2, 'reid', 'u'} In [18]: s.add('uu') In [19]: print(s) {1, 2, 'u', 'uu', 'reid'}
update更新:作为一个序列添加
In [20]: l1=[1,2,'reid'] In [21]: s=set(l1) In [22]: s.update('apt') In [23]: print(s) {1, 2, 'a', 't', 'reid', 'p'} In [24]: s.update('pppe') ##重复只显示一个 In [25]: print(s) {1, 2, 'e', 'a', 't', 'reid', 'p'} In [26]: s.update([44,'lin']) ##添加列表 In [27]: print(s) {1, 2, 'lin', 'e', 'a', 44, 't', 'reid', 'p'}
remove移除
In [28]: s.remove('reid') In [29]: s Out[29]: {1, 2, 44, 'a', 'e', 'lin', 'p', 't'}
pop弹出
In [30]: s.pop() Out[30]: 1 In [31]: s Out[31]: {2, 44, 'a', 'e', 'lin', 'p', 't'}
clear清空
In [32]: s.clear() In [33]: s Out[33]: set()
del删除
In [34]: del s In [35]: s NameError: name 's' is not defined
4.集合类型操作符
a. in, not in
b. 集合等价与不等价(==,!=)
In [37]: print(set('you')==set('yououou')) ##因为展开就是一个个字母显示的序列 True
c.关系测试
场景:如工作日上班打卡和周末上班打卡中,找出工作日与周末都有上班的人
交集
In [5]: a=set([1,2,3,4,5]) In [6]: b=set([4,5,6,7,8]) In [7]: a.intersection(b) Out[7]: {4, 5} In [16]: a & b Out[16]: {4, 5}
并集
In [8]: a.union(b) Out[8]: {1, 2, 3, 4, 5, 6, 7, 8} In [12]: a | b Out[12]: {1, 2, 3, 4, 5, 6, 7, 8}
差集
In [9]: a.difference(b) #a上有,b上没有 Out[9]: {1, 2, 3} In [13]: a - b Out[13]: {1, 2, 3} In [10]: b.difference(a) #b上有,a上没有 Out[10]: {6, 7, 8} In [14]: b - a Out[14]: {6, 7, 8}
反向交集(除了交集,也叫对称差集)
In [11]: a.symmetric_difference(b) Out[11]: {1, 2, 3, 6, 7, 8} In [15]: a ^ b Out[15]: {1, 2, 3, 6, 7, 8}
父集
In [17]: a.issuperset(b) ##a是否完全包含b Out[17]: False In [19]: a > b Out[19]: False
子集
In [18]: a.issubset(b) ##a不是b的子集 Out[18]: False In [20]: a < b Out[20]: False