1. 基本对象类型(python里面一切皆是对象)
(接前文)
1.8 集合(set)
1.8.1 集合的定义
集合(set)是一个无序的(即没有索引)不重复(会自动去重)元素序列。
可以使用大括号 { } 或者 set() 函数创建集合。
集合的元素必须是不可变的,也就是说字典、列表等不能作为集合的元素,字符串、数值、元组可以。
注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。建议创建集合都用set方法。
创建格式:
set_name = set(值序列) 或 set_name = {value01,value02,...},值序列可以是字符串、列表等
示例:字符串作为元素
>>> s1 = set('good')
>>> s1
输出:{'d', 'g', 'o'}
注意:1)set创建集合时字符串中每个字符当做一个元素;2)输出的元素是无序的;3)重复的元素会剔除;
>>> s1 = {'good'}
>>> s1
输出:{'good'} #注意和set(‘good’)的区别。
示例:列表/元组作为元素
>>> citys = set(['beijing','shanghai','guangzhou'])
>>> citys
{'shanghai', 'beijing', 'guangzhou'}
示例:字典作为元素(将字典的键作为元素)
>>> s1 = set({'zhao':18,'qian':20,'sun':17})
>>> s1
{'zhao', 'qian', 'sun'}
示例:集合元素不能为可变数据类型
>>> s1 = set([1,2,[3,4]]) #元素为可变的列表[3,4],报错。
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
TypeError: unhashable type: 'list'
1.8.2 集合相关方法
1.8.2.1 add方法 集合中添加一个元素
将元素 x 添加到集合 s 中,如果元素已存在,则不进行任何操作。
格式:s.add(x)。 示例:
>>> citys = set(['beijing','shanghai','guangzhou'])
>>> citys
{'shanghai', 'beijing', 'guangzhou'}
>>> citys.add('shenzheng')
>>> citys
{'shanghai', 'beijing', 'shenzheng', 'guangzhou'}
1.8.2.2 update 参数以列表,元组,字典等形式添加元素
格式:s.update( x ), x可以是字符串、列表、元组、字典等,可以有多个,用逗号分开。
若是字典,则是将字典的key作为元素添加到集合中。
示例:同时将字符串、列表、元组、字典作为参数,将里面的元素添加到s1中
>>> s1 = {'a','b','c'}
>>> s1.update('de',['f','g'],('h','i'),{'j':'Jack','k':'Kim'})
>>> s1
{'d', 'h', 'e', 'j', 'a', 'g', 'k', 'c', 'f', 'i', 'b'} #注意是无序的
1.8.2.3 remove() 、discard( )和pop() 从集合中移除某个元素
格式:s.remove( x ),将元素 x 从集合 s 中移除,如果元素不存在,则会发生错误。
s.discard( x ),将元素 x 从集合 s 中移除,如果元素不存在,不会发生错误。
s.pop(), 随机删除集合中的元素。先对集合进行无序排列,然后删除第一个元素并返回被删除的元素。
示例:
>>> s1 = set('abcd')
>>> s1
{'b', 'a', 'c', 'd'}
>>> s1.remove('b')
>>> s1
{'a', 'c', 'd'}
>>> s1.discard('c')
>>> s1
{'a', 'd'}
>>> s1.pop()
'd'
>>> s1.discard('d') #不存在的元素,不会发生错误,相当于没有做移除操作。
>>> s1.remove('d') #不存在的元素,发生错误
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
KeyError: 'd'
1.8.2.4 clear()
格式: s.clear(),清空集合 s。
示例:
>>> s1 = set('abc')
>>> s1.clear()
>>> s1
1.8.2.5 x in s 判断元素 x 是否在集合 s 中
判断元素 x 是否在集合 s 中,存在返回 True,不存在返回 False。
示例:
>>> s1 = set('abc')
>>> 'a' in s1
True
>>> 'd' in s1
False
>>> 'a' not in s1
False
>>> 'd' not in s1
True
1.8.2.6 copy() 集合复制
>>> s1 = set('abc')
>>> s1
{'b', 'a', 'c'}
>>> s2 = s1.copy()
>>> s2
{'b', 'a', 'c'}
1.8.2.7 difference() 方法用于返回集合的差集
返回集合的差集,即返回的集合元素包含在第一个集合中,但不包含在第二个集合中。返回的是集合。
示例:
>>> citys1 = {'beijing','shanghai','tianjing','wuhan'}
>>> citys2 = {'beijing','shenzheng','tianjing'}
>>> citys3 = citys1.difference(citys2)
>>> citys3 #返回新集合(set1中在set2中不存在的)
{'shanghai', 'wuhan'}
>>> citys1 #不改变原计划
{'tianjing', 'shanghai', 'beijing', 'wuhan'}
1.8.2.8 difference_update() 移除两个集合中都存在的元素(原集合剩下第二个集合中不存在的元素)
格式:set1.difference_update(set2), 移除两个集合中都存在的元素,没有返回值。
>>> citys1 = {'beijing','shanghai','tianjing','wuhan'}
>>> citys2 = {'beijing','shenzheng','tianjing'}
>>> citys1.difference_update(citys2) #从set1中移除set2中存在的元素
>>> citys1 #改变原集合
{'shanghai', 'wuhan'}
1.8.2.9 intersection() 返回两个或更多集合中都包含的元素(不改变原集合)
格式:set1.intersection(set2, set3 ... etc)
返回两个或更多集合中都包含的元素,即交集,返回的是集合。
>>> citys1 = {'beijing','shanghai','tianjing','wuhan'}
>>> citys2 = {'beijing','shenzheng','tianjing'}
>>> citys3 = citys1.intersection(citys2,citys3)
>>> citys3 #返回新集合,set1和set2中都存在的元素
{'beijing', 'tianjing'}
>>> citys1 #不改变原集合
{'tianjing', 'shanghai', 'beijing', 'wuhan'}
1.8.2.10 intersection_update() 原集合中只保留两个或更多集合中都存在的元素(改变原集合)
格式和使用方法与intersection相同。无返回值
区别:intersection() 返回一个新的集合;
intersection_update() 在原始的集合上移除不重叠的元素,即在原集合中保留都存在的元素。
>>> citys1 = {'beijing','shanghai','tianjing','wuhan'}
>>> citys2 = {'beijing','shanghai','tianjing'}
>>> citys3 = {'beijing','tianjing'}
>>> citys1.intersection_update(citys2,citys3) #从set1中只保留set2、set3都存在的元素
>>> citys1
{'beijing', 'tianjing'}
1.8.2.11 symmetric_difference() 返回两个集合中不重复的元素集合
返回两个集合中不重复的元素集合,即会移除两个集合中都存在的元素。
语法:set.symmetric_difference(set)
1.8.2.12 isdisjoint() 判断两个集合是否不包含相同的元素
格式:set1.isdisjoint(set2)
判断两个集合是否不包含相同的元素,如果没有返回 True,否则返回 False。
示例:
>>> citys1 = {'beijing','shenzheng','tianjing'}
>>> citys2 = {'wuhan','shenzheng'}
>>> citys1.isdisjoint(citys2)
False
1.8.2.13 issubset() 判断集合的所有元素是否都包含在指定集合中
语法:set1.issubset(set2)
示例:
>>> s1 = {'1','2','a'}
>>> s2 = {'1','a','c','2'}
>>> s1.issubset(s2)
True
1.8.2.14 issuperset() 判断指定集合的所有元素是否都包含在原始的集合中(与issubset相反)
语法:set1.issuperset(set2)
>>> s1 = {'1','a','c','2'}
>>> s2 = {'1','2','a'}
>>> s1.issuperset(s2)
True