集合类型
集合支持成员关系操作符(in)、对象大小计算操作符(len()),支持比较,也支持逻辑操作符
Python提供了两种内置的集合类型:可变的set类型,固定的frozenset类型
只有可哈希运算的对象可以添加到集合中,所有内置的固定数据类型(比如float、frozenset、int、str、tuple)都是可哈希运算的,内置的可变数据类型(比如dict、list、set)都不是可哈希运算的
注意:比较操作符==与!=比较方式是逐项比较,其他比较操作符则进行子集比较或超集比较
集合
集合是0个或多个对象引用的无序组合,对象引用所引用的对象都是可哈希运算的
集合石可变的,可以添加或移除数据项,由于其中的项是无序的,不能分片或按布距分片
函数
set() #不带参数时将返回一个空集合
注意:非空集合可以不使用set()函数创建,空集合必须使用set()创建,而不能使用空的圆括号来创建
集合中的每个数据项都是独一无二的,添加重复的数据项固然不会引发问题,但毫无意义,如:set("apple")、set("aple")、{'e', 'p', 'a', 'l'}
集合常用于删除重复的数据项,如:x = list(set(x)),x中的每个字符串都是独一无二的,其存放顺序也是任意的
集合方法与操作符
s.add(x) #将数据项x添加到集合s中——如果s中尚未包含x
s.clear() #移除集合s中的所有数据项
s.copy() #返回集合s的浅拷贝
s.difference(t) s - t #返回一个其中包含在s中但不在集合t中的所有数据项的集合
s.difference_update(t) s -= t #移除每一个在集合t但不在集合s中的项
s.discard(x) #如果数据项x存在于集合s中,就移除该数据项,跟set.remove()相同
s.intersection(t) s & t #返回一个其中包含所有同时包含在集合t与s中的数据项的集合
s.intersection_update(t) s &= t #使得集合s包含自身与集合t的交集
s.isdisjoint(t) #如果集合s与t没有相同的项,就返回True
s.issubset(t) s <= t #如果集合s与集合t相同,或者是t的子集,就返回True。使用s < t可以测试s是否是t的真子集
s.issuperset(t) s >= t #如果集合s与集合t相同,或者是t的超集,就返回True。使用s > t可以测试s是否是t的真子集
s.pop() #返回并移除集合s中一个随机项,如果s为空寂,就产生KeyError异常
s.remove(x) #从集合s中移除数据项x,如果s中不包含x,就产生KeyError异常,跟set.discard()相同
s.symmetric_difference(t) s ^ t #返回一个其中包含s与t中的每个数据项,但不包含同时子啊这两个集合中的数据项的集合
s.symmetric_difference_update(t) s ^= t #使得集合s只包含其自身与集合t的对称差
s.union(t) s | t #返回一个其中包含集合s中的所有数据项以及在t中而不在s中的数据项的集合
s.update(t) s |= t #将集合t中每个s中不包含的数据项添加到集合s中
set("pecan") | set("pie") == {'p', 'e', 'c', 'a', 'n', 'i'}
set("pecan") & set("pie") == {'p', 'e'}
set("pecan") - set("pie") == {'c', 'a', 'n'}
set("pecan") ^ set("pie") == {'c', 'a', 'n', 'i'}
集合内涵
语法
{expression for item in iterable}
{expression for item in iterable if condition}
>>>html = {x for x in files if x.lower().endswith((".htm", ".html"))}
固定集合
固定集合是一旦创建后就不能改变的集合
固定集合只能使用frozenset数据类型函数进行创建,不带参数调用时,frozenset()将返回一个空的固定集合,带参数时,将返回该参数的浅拷贝。该函数只接受一个函数
方法
frozenset.copy()
frozenset.difference(t) s - t
frozenset.intersection(t) s & t
frozenset,isdisjoint(t)
frozenset.issubset(t) s <= t
frozenset.issuperset(t) s >= t
frozenset.symmetric_difference(t) s ^ t
frozenset.union(t) s | t
如果将二元运算符应用于集合与固定集合,那么产生结果的数据类型与左边操作数的数据类型一致
f是一个固定集合,s是一个集合,那么f & s将产生一个固定集合,s & f则产生一个集合
使用==与!=等操作符时,操作数的顺序无关紧要,如果两个集合包含相同的项,那么f == s结果为True
集合与固定集合都可以包含固定集合