前言Set是一种组合数据类型,分为mutableset和immutablefrozenset。软件环境系统UbuntuKylin14.04软件Python2.7.3IPython4.0.0变量集集合集合是一个无序且唯一的元素集合,类似于数学中集合的概念,可以相交、合并、求微、求补等逻辑操作。不支持索引和切片等序列操作,但仍然支持成员运算符in-notin和理解等操作。在特定的场合下,可以表现出非常好的执行效率。set()函数创建一个集合set(iterable)->newsetobject,其中iterable可以是List、Tuple、Dictionary。但是,当它是dict时,只会获取提供Key作为集合的元素。n[12]:s=set([1,2,3])In[13]:sOut[13]:{1,2,3}In[14]:type(s)Out[14]:setIn[141]:s2=set('jmilk')In[142]:s2Out[142]:{'i','j','k','l','m'}注意:set()函数可以仅接受迭代器(String、Tuple、List、Dict、set)作为参数。In[180]:s1=set(1)----------------------------------------------------------------------TypeErrorTraceback(mostrecentcalllast)in()---->1s1=set(1)TypeError:'int'objectisnotiterable传递非迭代器参数时会报错。创建一个空集合set()->newemptysetobject通过上面的例子可以看出set类型的数据也和dict类型一样用{}标记,但是需要注意的是:dict类型可以使用dic={}要创建一个空字典,setTypes不能,只能通过s=set()创建。In[15]:s=set()In[16]:sOut[16]:set()In[17]:d={}In[18]:dOut[18]:{}In[20]:type(s),type(d)Out[20]:(set,dict)注:因为set()是一个可变集合,元素个数不固定,所以有add()和remove()方法。但也因为它的可变性,set()类型的对象没有哈希值(hashvalue),不能作为dict对象的key和其他set对象的元素。哈希值:通过算法将不同长度的输入数据源转换为一致长度的数据输出,以提高搜索速度。MD5:计算文件或数据源(string,value)得到一个固定值,用于验证文件或数据源是否被篡改。一般用于文件的数字签名。集合元素的唯一性无论是set还是frozenset,元素都是唯一的,重叠的元素会自动合并。In[17]:li=[1,2,3,1,1,2,'a','b','a']In[18]:s1=set(li)In[19]:s2=frozenset(li)In[20]:s1,s2Out[20]:({1,2,3,'a','b'},frozenset({1,2,3,'a','b'}))集合推导从迭代器推导出一个新集合。In[175]:set(x**2forxinrange(1,6)ifx<4)Out[175]:{1,4,9}set类型对象的内置方法add()添加一个元素add(...)添加一个元素到一个集合。如果该元素已经存在,则这没有效果。向集合对象中添加一个元素,如果该元素已经存在,则没有任何作用。In[41]:s1=set(range(10))In[42]:s1Out[42]:{0,1,2,3,4,5,6,7,8,9}In[43]:s1.add(10)In[44]:s1Out[44]:{0,1,2,3,4,5,6,7,8,9,10}remove()移除一个元素remove(...)从集合中删除一个元素;它必须是成员。如果元素不是成员,则引发KeyError。指定删除集合对象中的一个元素,如果集合中不存在该元素,将返回错误。In[47]:s1Out[47]:{0,1,2,3,4,5,6,7,8,9,10}In[48]:s1.remove(0)In[49]:s1Out[49]:{1,2,3,4,5,6,7,8,9,10}一次只能删除i个元素。pop()随机删除并返回一个元素pop(...)Removeandreturnarbitrarysetelement.RaisesKeyErrorifthesetisempty.随机删除并返回集合中的一个元素,如果集合为空则返回错误。In[65]:s2=set(['j','m','i','l','k'])In[66]:s2.pop()Out[66]:'i'In[67]:s2.pop()Out[67]:'k'discard()删除一个元素discard(...)Removeanelementfromasetifitisamember.Iftheelementisnotamember,donothing.指定删除集合中的一个元素,如果不存在该元素,则什么都不做。In[90]:s1Out[90]:{1,2,3,4,5,6,7,8,9}In[91]:s1.discard(1)In[92]:s1Out[92]:{2,3,4,5,6,7,8,9}In[93]:s1.discard('abc')In[94]:s1Out[94]:{2,3,4,5,6,7,8,9}clear()clear(...)从此集合中删除所有元素。清除集合中的所有元素In[94]:s1Out[94]:{2,3,4,5,6,7,8,9}In[95]:s1.clear()In[96]:s1Out[96]:set()注意:上面列出的函数是变量类型set对象特有的函数,除此之外,还有一些set和frozenset共用的内置函数,后面会介绍。不可变集合Frozensetfrozenset冻结集合,即不可变集合。frozenset的元素是固定的,一旦创建就不能添加、删除或修改。它最大的优点是使用hash算法实现,所以执行速度快,frozenset可以作为dict字典的key,也可以作为其他集合的元素。frozenset()创建一个frozenset集合frozenset(object)frozenset()->emptyfrozensetobjectfrozenset(iterable)->frozensetobjectBuildanimmutableunorderedcollectionofuniqueelements。创建固定无序集合In[108]:f1=frozenset()#EmptyfrozensetcollectionIn[109]:f2=frozenset([1,2,3,'JMilk'])In[110]:f1,f2Out[110]:(frozenset(),frozenset({1,2,3,'JMilk'}))set可以和frozenset比较In[4]:s1=set([1,2,3])In[5]:s2=frozenset([1,2,3])In[6]:s1==s2Out[6]:Trueset和frozenset的混合操作两种类型set的混合操作会返回第一个操作元素的类型。In[12]:s1=set([1,2,3])In[13]:s2=frozenset([2,3,4])In[14]:s3=s1|s2In[15]:s3,type(s3)Out[15]:({1,2,3,4},set)frozenset设置为dicIn[138]:f=frozenset(['name'])In[139]:dic=的键{f:'Jmilk'}In[140]:dicOut[140]:{frozenset({'name'}):'Jmilk'}set不能作为字典的Key:In[144]:s1=set(['JMilk'])In[145]:dic={s1:'name'}---------------------------------------------------------------------TypeErrorTraceback(mostrecentcallast)in()---->1dic={s1:'name'}TypeError:unhashabletype:'set'#没有hashset和frozenset共享的内置函数集和frozenset都支持集合之间的比较、交集、并集、差集操作,类似于数据集的比较。但需要注意的是:由于frozenset是一个不可变的集合,frozenset不能调用以下函数中带有'_update'关键字的函数。注意:带有_update的函数是使用就地操作实现的,并且具有较低的资源消耗。但在这种情况下,函数没有返回值,即不能将结果赋值给新的变量。intersection(),intersection_update()Intersectionintersection(...)返回两个或多个集合的交集sanewset。返回几个集合的交集运算得到的新交集,可以传入多个iterator类型的参数。即可以传入Tuple、List、String、Dictionary、Set等类型的参数。集合之间的交集In[59]:s1Out[59]:{1,2,3,'a','b'}In[60]:s2Out[60]:{3,4,5,'b','c','d'}In[61]:s3=set([1,3,8,9,10,'d''e','f'])In[62]:s4=s1。intersection(s2,s3)In[63]:s4Out[63]:{3}注意:您还可以使用逻辑与运算符'&'In[28]:s3=s1&s2In[29]:s3Out[29]:{3,'b'}设置并列出交集In[64]:liOut[64]:[1,2,3,1,1,2,'a','b','a']In[65]:s4=s1.intersection(li)In[66]:s4Out[66]:{1,2,3,'a','b'}集合和元组交集In[67]:tup=(2,'a','c')In[68]:s4=s1.intersection(tup)In[69]:s4Out[69]:{2,'a'}设置与字符串交集注意:仅在String上进行交集操作String的字符,不能对String的数字进行运算。In[70]:str='123abc'In[71]:s4=s1.intersection(str)In[72]:s4Out[72]:{'a','b'}In[79]:s1Out[79]:{1,2,3,'a','b'}交集和字典注意:字典中的Key只能进行交集操作。In[79]:s1Out[79]:{1,2,3,'a','b'}In[80]:dic={1:'name',2:'age'}In[81]:s4=s1.intersection(dic)In[82]:s4Out[82]:{1,2}intersection()和intersection_update()的区别intersection_update(...)用自身和另一个的交集更新一个集合。更新自己的相交集。注意:当我们要将两个对象的交集结果更新为其中一个操作对象时,推荐使用intersection_update()函数。该功能采用就地运行方式实现,资源消耗较低。但是intersection_update()函数是没有返回值的,即结果不能赋值给新的变量。In[94]:s1Out[94]:{1,2,3,'a','b'}In[95]:s2Out[95]:{3,4,5,'b','c','d'}In[96]:s1.intersection_update(s2)In[97]:s1Out[97]:{3,'b'}union()和update()与intersection()相同,可以传不同的迭代器类型参数。union()返回union(…)Returntheunionofsetsasanewset.In[108]:s4Out[108]:{1,2,3,4,5,8,9,10,'a','b','c','d','de','f'}注意:可以使用逻辑或运算符'|'In[109]:s4=s1|s2|s3In[110]:s4Out[110]:{1,2,3,4,5,8,9,10,'a','b','c','d','de','f'}update()用update(...)更新集合setwith本身和others.update()方法的联合是没有返回值的。In[111]:s1.update(s2,s3)In[112]:s1Out[112]:{1,2,3,4,5,8,9,10,'a','b','c','d','de','f'}difference(),difference_update()differencedifference()difference(...)将两个或多个集合的差异作为新集合返回。由一个不存在的集合返回一个新的集合,该集合由来自其他几个集合的元素组成。In[122]:s1Out[122]:{1,2,3,'a','b'}In[123]:s2Out[123]:{3,4,5,'b','c','d'}In[124]:s3=s1.difference(s2)In[125]:s3Out[125]:{1,2,'a'}注意:可以使用算术运算符减去'-'In[126]:s3=s1-s2In[127]:s3Out[127]:{1,2,'a'}difference_update()difference_update(...)从这个集合中移除另一个集合的所有元素。更新原始集合。In[130]:s1.difference_update(s2)In[131]:s1Out[131]:{1,2,'a'}symmetric_difference(),symmetric_difference_update()求集合之差的并集symmetric_difference()symmetric_difference(...)将两个集合的对称差异作为一个新集合返回。返回(set1–set2)|(set2–set1)In[138]:s1Out[138]:{1,2,3,'a','b'}In[139]:s2Out[139]的结果:{3,4,5,'b','c','d'}In[140]:s3=s1.symmetric_difference(s2)In[141]:s3Out[141]:{1,2,4,5,'a','c','d'}等同于:In[147]:s1-s2Out[147]:{1,2,'a'}In[148]:s2-s1Out[148]:{4,5,'c','d'}In[144]:s3=(s1-s2)|(s2-s1)In[145]:s3Out[145]:{1,2,4,5,'a','c','d'}注:可以用^代替In[142]:s3=s1^s2In[143]:s3Out[143]:{1,2,4,5,'a','c','d'}symmetric_difference_update()symmetric_difference_update(…)用自身和另一个的对称差更新一个集合。In[150]:s1.symmetric_difference_update(s2)In[151]:s1Out[151]:{1,2,4,5,'a','c','d'}集合之间的关系是相等的:只有每个集合是另一个集合两个集合只有当它们是集合的子集时才相等。Lessthan(set1includedinset2):只有当第一个set1是另一个set2的子集,并且两个set不相等时,第一个set1小于第二个set2。大于(set1containsset2):只有当第一个set1是第二个set2的超集且两者不相等时,第一个set2大于第二个set2。isdisjoint()两个集合不相交isdisjoint(...)如果两个集合有一个空交集,则返回True。即set1&set2==set()时,为TrueIn[155]:s1Out[155]:{1,2,4,5,'a','c','d'}In[156]:s2Out[156]:{3,4,5,'b','c','d'}In[158]:(s1-s2)&s2==set()Out[158]:TrueIn[159]:s2.isdisjoint(s1-s2)Out[159]:Trueiisperset()一个set包含另一个setissuperset(…)报告这个set是否包含另一个set.In[169]:s1Out[169]:{0,1,2}In[170]:s2Out[170]:{0,1,2,3,4}In[172]:s2.issuperset(s1)Out[172]:Trues2大于s1issubset()中包含一个集合anothersetissubset(...)报告另一个set是否包含这个set.In[169]:s1Out[169]:{0,1,2}In[170]:s2Out[170]:{0,1,2,3,4}In[171]:s1.issubset(s2)Out[171]:Trues1主要是通过s2中包含的集合的数据类型转换,转换为序列类型。In[1]:set1=set(range(5))In[2]:li=list(set1)In[3]:tup=tuple(set1)In[4]:string=str(set1)In[5]]:li,tup,stringOut[5]:([0,1,2,3,4],(0,1,2,3,4),'set([0,1,2,3,4])')***Set是一个非常有趣的数据结构,他可能不经常被使用,但是在严格的执行环境下,set是一个非常好的选择。