Python—集合类型之集合

集合类型

集合支持成员关系操做符(in)、对象大小计算操做符(len()),支持比较,也支持逻辑操做符html

Python提供了两种内置的集合类型:可变的set类型,固定的frozenset类型python

只有可哈希运算的对象能够添加到集合中,全部内置的固定数据类型(好比float、frozenset、int、str、tuple)都是可哈希运算的,内置的可变数据类型(好比dict、list、set)都不是可哈希运算的express

注意:比较操做符==与!=比较方式是逐项比较,其余比较操做符则进行子集比较或超集比较app

集合

集合是0个或多个对象引用的无序组合,对象引用所引用的对象都是可哈希运算的函数

集合石可变的,能够添加或移除数据项,因为其中的项是无序的,不能分片或按布距分片测试

函数

set()    #不带参数时将返回一个空集合

注意:非空集合能够不使用set()函数建立,空集合必须使用set()建立,而不能使用空的圆括号来建立 spa

集合中的每一个数据项都是独一无二的,添加剧复的数据项当然不会引起问题,但毫无心义,如:set("apple")、set("aple")、{'e', 'p', 'a', 'l'}code

集合经常使用于删除重复的数据项,如:x = list(set(x)),x中的每一个字符串都是独一无二的,其存放顺序也是任意的htm

集合方法与操做符

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

集合与固定集合均可以包含固定集合