本文转载自优儿之家微信公众号《你的家》。转载本文请联系悠儿之家公众号。大家好,我是Peter~在之前的Python文章中,我们介绍了Python中很多不同类型的对象:字符串、列表、元组和字典。它们各有特点:字符串str:有索引,字符串中的元素可以重复,元素不可变,不可修改的列表list:也可以进行索引和切片操作,元素可以是被修改且是可变元组tuple:可以看做是一个不可修改的“列表”;元素不能直接修改,但也可以进行索引和切片,类似于列表字典:Python中很常用,由键值对组成,键必须是可变数据类型(如元组),值可以是任何数据;字典是无序的如果说元组是列表和字符串的混合体,那么集合可以看作是列表和字典的混合体Python连载文章全文目录结构:集合创建创建集合的方式有两种:通过集合创建函数,空集合只能通过{}这样创建s1=set()#emptysets1set()type(s1)set注意:空集合必须使用set函数创建,因为{}是用来创建一个空字典。非空集合使用花括号创建s2={1,2,3,4}s2{1,2,3,4}type(s2)set使用set函数创建s3=set([9,8,7,6])#将元素放入一个list中,set只能有一个参数s3{6,7,8,9}type(s3)sets4=set((11,22,33,44))#Assemblewithelementss4{11,22,33,44}集合的元素不能重复;如果有重复的元素,set会自动去重。这是一个非常高效的去重方法s5=set([1,2,3,4,3,2,1])#s5自动生成的数据中有重复数据{1,2,3,4}重复去掉type(s5)#Viewtypesets6=set("javascript")#字符串中A重复,会自动去掉s6{'a','c','i','j','p','r','s','t','v'}特别是我们在创建集合的时候需要注意数据类型s7={"python",[1,2,3"java"],{"name":"xiaoming","age":19},100}s7TypeErrorTraceback(mostrecentcalllast)in---->1s7={"python",[1,2,3,"java"],{"name":"xiaoming","age":19},100}2s7TypeError:unhashabletype:'list'上面报错中的关键字:unhashable,中文是无法散列的。这意味着在创建时有一个不可散列的数据类型:列表。我们可以记住:Non-hashable表示可变的,比如列表、字典等。Hashable表示不可变的,比如字符串、字典的键等。当我们创建一个集合的时候,元素必须是hashableSet集合方法首先,我们使用dir(set)查看集合的操作方法:print(dir(set))['__and__','__class__','__contains__','__delattr__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__','__gt__','__hash__','__iand__','__init__','__init_subclass__','__ior__','__isub__','__iter__','__ixor__','__le__','__len__','__lt__','__ne__','__new__','__or__','__rand__','__reduce__','__reduce_ex__','__repr__','__ror__','__rsub__','__rxor__','__setattr__','__sizeof__','__str__','__sub__','__subclasshook__','__xor__','add','clear','copy','difference','difference_update','discard','intersection','intersection_update','isdisjoint','issubset','issuperset','pop','remove','symmetric_difference','symmetric_difference_update','union','update']add-addimmutable添加元素s3到元素集合#originalcollection{6,7,8,9}s3.add(1)#add1s3{1,6,7,8,9}s3.add(2)#add2s3{1,2,6,7,8,9}s3.add([1,3,5])------------------------------------------------------------------------TypeErrorTraceback(mostrecentcallast)ins3.add(tuple1)#addtuple---->1s3。add([1,3,5])TypeError:unhashabletype:'list'错误信息:列表不可哈希,即变量类型之前我们说过:集合中的元素都是可哈希的(不可变类型),所以不能直接加上notavailableChangedtuple1(1,3,5)s3.add(tuple1)#在update集合中添加tuples3{(1,3,5),1,2,6,7,8,9}update-更新集合元素,合并来自两个集合的元素#创建两个具有相同元素的集合"python"s8=set(["python","java","c"])s9=set(["python"","go","javascript","html"])s8.update(s9)s8{'c','go','html','java','javascript','python'}生成的数据自动去重pythonins9#s9依然不变{'go','html','javascript','python'}update的参数不仅仅是集合,还是不可变数据类型:help(set.update)#查看方法Help的文档信息onmethod_descriptor:update(...)用自身和其他的并集更新集合。s9.update("hello")s9{'e','go','h','html','javascript','l','o','蟒蛇'}s9.update((7,8,9))s9{7,8,9,'e','go','h','html','javascript','l','o','python'}pop-randomdelete随机删除一个元素并返回删除的结果。pop不能指定参数,即不能指定要删除的元素----------------------------------------------------------------TypeErrorTraceback(mostrecentcalllast)in---->1s9.pop("python")#cannottakeparametersTypeError:pop()takesnoarguments(1given)remove-指定移除移除的元素必须在集合中。如果不存在,会报错s8{'c','go','html','java','javascript','python'}s8.remove("go")s8#结果显示那个go已经删除了{'c','html','java','javascript','python'}s8.remove("go")#如果再删除go会报错,因为go没有不再存在------------------------------------------------------------------------KeyErrorTraceback(mostrecentcalllast)in---->1s8.remove("go")#再次删除go会报错,因为go不再存在KeyError:'go'discard-Delete指定删除一个元素,如果该元素不存在则不会报错。s8#原始数据{'c','html','java','javascript','python'}s8.discard("html")s8#删除数据{'c','java','javascript'','python'}s8{'c','java','javascript','python'}s8.discard("go")上面的结果表明,如果删除的元素不存在,则不会报错。这个不同于removeclear-cleartheset删除集合中的所有元素s8{'c','java','javascript','python'}s8.clear()#clearthesets8set()bool(s8)#boolvalueisFalseFalse常量集合-frozenset()上面set方法创建的集合,我们理解集合是mutable,也就是modifiable,或者unhashable。其实还有一种创建不可变集合的方法:frozenset(),可以理解为冻结集合,所以不能进行修改等操作。f_set=frozenset("python")f_setfrozenset({'h','n','o','p','t','y'})看看这个frozenset的操作方法print(dir(f_set))#Frozencollection['__and__','__class__','__contains__','__delattr__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__','__gt__','__hash__','__init__','__init_subclass__','__iter__','__le__','__len__','__lt__','__ne__','__new__','__or__','__rand__','__reduce__','__reduce_ex__','__repr__','__ror__','__rsub__','__rxor__','__setattr__','__sizeof__','__str__','__sub__','__subclasshook__','__xor__','复制','差异','intersection','isdisjoint','issubset','issuperset','symmetric_difference','union']print(dir(s9))#set集合,非冻结集合['__and__','__class__','__contains__','__delattr__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__','__gt__','__hash__','__iand__','__init__','__init_subclass__','__ior__'、'__isub__'、'__iter__'、'__ixor__','__le__','__len__','__lt__','__ne__','__new__','__or__','__rand__','__reduce__','__reduce_ex__','__repr__','__ror__','__rsub__','__rxor__','__setattr__','__sizeof__','__str__','__sub__','__subclasshook__','__xor__','add','clear','copy','difference','difference_update','discard','intersection','intersection_update','isdisjoint','issubset','issuperset','pop','remove','symmetric_difference','symmetric_difference_update','union','update']通过比较两个集合的操作方法,我们发现:frozen集合中的增删方法明显少了很多,所以frozen集合是一个不可变的集合操作。本节介绍集合中的各种操作,如:交集、并集、补集等元素内判断s5{1,2,3,4}1ins5True6ins5Falseissubset-subsetandissuperset-superset如果A是B的子集,则B是A的超集;也就是说A的所有元素都在B中s10={1,2}#新建一个集合s10{1,2}s10.issubset(s5)#s10是s5的子集Trues5.issuperset(s10)#s5是s10的超集Trues9{7,8,9,'e','go','h','javascript','l','o'}s9.issubset(s5)#显然s9不是s5的子集Falseintersection-intersection要找到两个集合的交集,请使用交集函数或&print(s5)print(s10){1,2,3,4}{1,2}s5.intersection(s10){1,2}s5&s10{1,2}union-union使用函数union或|到代表两个集合的并集,会生成一个新的对象print(s5)print(s9){1,2,3,4}{'javascript','o',7,'l','go','h',8,9,'e'}s11=s5|s9s11{1,2,3,4,7,8,9,'e','go','h','javascript','l','o'}s5.union(s9){1,2,3,4,7,8,9,'e','go','h','javascript','l','o'}difference-差集,补集使用函数differenceorminussign-print(s5)print(s10){1,2,3,4}{1,2}s5-s10{3,4}s5.difference(s10){3,4}s10-s5set()symmetric_difference-对称差集使用函数symmetric_difference或symmetric_difference_update(原位更新数据)s12={1,3,4,5,7}s12{1,3,4,5,7}s5#原始数据{1,2,3,4}s5.symmetric_difference(s12){2,5,7}s5#原始数据没有变化{1,2,3,4}s5.symmetric_difference_update(s12)s5#原始数据为输出结果{2,5,7}