Python内置两种集合类型,一种是可变的set类型,一种是固定的frozenset。集合类型可以理解为非序列类型,也就是说集合中的元素都是乱序的,因此set类型是不支持索引的,其还有个特性就是内部元素都是独一无二的,因此可以用来进行去除重复的元素。集合也支持比较,支持|、&、^等。下面分为几个部分对其进行总结:
1、集合的创建
集合中的的元素必须是可哈希的,也就是不可变的,其具有唯一的hash值,例如列表这样可变的数据类型不能作为集合的元素。但是集合本身可以添加和删除元素。
#以{}方式创建,内含可哈希的对象的引用
s = {} #创建空集合
s = {1,2,"This is s1",('a','b')}
#错误 s1 = {[1,2,3]}不可创建,列表是可变的
#以set函数创建
s1 = set() #创建空集合
s1 = set("hello") #s1 有可能== {'h','e','l','o'},也不一定是这样,因为集合是乱序的,与刚开始创建无关
s1 = set([1,2,3,4,1,2]) #将列表转换为集合并且去除多余的重复元素 s1 有可能== {1,2,3,4}
2、集合对象内置方法
s = {1,2,"apple",('f','f','l','y')}
#s.add(i)方法,将i加入到集合s中,如果i已经存在,那么不改变s
s.add("orange")
s.add("apple") #不改变s
#s.clear()移除集合s中的所有项,s变为空集合
#s.copy()返回集合s的浅拷贝,浅拷贝与深拷贝的差别在于递归的改变元素值影不影响原始对象
s1 = s.copy()
s1.add(3) #s1中增加元素3,s中并未增加
#s.difference(t) 等价于s-t,返回一个新集合,其元素包含在s中,但是不在t中
t = {2,3}
s1 = s.difference(t) #返回新的集合s1,s1中去除2这个对象引用
#s.difference_update(t) 相当于s -= t.并不返回新集合,而是在s上面进行更改,其他的与s.difference()一样
#s.disscard(i),如果i存在于s中,就从s中移除i,如果i不存在那么不做任何改变
#s.remove(i),基本同s.discard(),但是如果i不存在,那么触发KeyError异常,异常提示为i
#s.intersection(t),相当于s&t,返回一个新集合,元素为s和t的交集,也就是元素同时存在于s和t,没有就返回空集合
#s.intersection_update(t),s &= t,与上基本相同,只不过不返回新的集合,而是在s上做改变
#s.isdisjoint(t),如果s和t中没有相同的项就返回True
#s.issubset(t),判断s <=? t 如果是就返回True
#s.issuperset(t),判断s >=? t 如果是就返回True
#s.pop() 返回s中的一个随机项,如果s为空就触发KeyError异常
#s.symmetric_difference(t),相当于s^t,返回一个新的集合,包含s和t中的每个数据项,但是不包含同时在s和t中的数据项
#s.symmetric_difference_update(t),相当于s ^= t
s.union(t),相当于s|t,返回一个新的集合,包含s中所有数据,以及t中不在s中的数据
s.update(t),相当于s |= t
3、集合生成式
#与列表生成式一样
s = {i ** 2 for i in range(1,10)} #生成的s是乱序的
4、固定集合
固定集合用frozenset()创建,创建后的集合将不可改变,凡是不改变自身的set对象方法都可用于frozenset()创建的集合对象