集合set是Python中一种基本数据类型,它分为可变集合(set)和不可变集合(frozenset)两种。相似于其余语言,集合是一个无序不重复元素集,包括建立集合set、向集合中添加元素、删除集合中的元素、求集合的交集、并集、差集等操做
(一)集合的增删改查
(1)集合的建立与赋值——惟一的方法工厂方法 set()和 frozenset()python
>>> l=set() #空集合 >>> s=set("cheeseshop") #字符串做为参数 >>> s set(['c', 'e', 'h', 'o', 'p', 's']) >>> s1 = set([1,2,3,1,3,4,5]) #list做为参数 >>> s1 set([1, 2, 3, 4]) >>> s2 = set((1,2,3,4,1)) #元组做为参数 >>> s2 set([1, 2, 3, 4]) >>> s3 = set({1:2,2:3}) #字典做为参数 >>> s3 set([1, 2]) >>> b=set(3,4,5) Traceback (most recent call last):File "<stdin>", line 1, in <module> TypeError: set expected at most 1 arguments, got 3
(2)访问集合的值
遍历查看集合成员或检查某项元素是不是一个集合中的成员:app
>>> s set(['c', 'e', 'h', 'o', 'p', 's']) >>> "k" in s False >>> "c" not in s False >>> for i in s: ... print i #输出c e h o p s
(3)更新集合
用各类集合内建的方法和操做符添加和删除集合的成员:只有可变集合能够修改不可变集合不能够修改。函数
>>> s set(['c', 'e', 'h', 'o', 'p', 's']) >>> s.add("z") >>> s set(['c', 'e', 'h', 'o', 'p', 's', 'z']) >>> s.update("pypi") >>> s set(['c', 'e', 'i', 'h', 'o', 'p', 's', 'y', 'z'])
(4)删除集合中的成员和集合
若是如何删除集合自己,能够像删除任何 Python 对象同样,令集合超出它的做用范围,或调用 del 将他们直接清除出当前的名字空间。code
>>> s.remove("z") >>> s set(['c', 'e', 'i', 'h', 'o', 'p', 's', 'y']) >>> s-=set("pypi") >>> s set(['c', 'e', 'h', 'o', 's']) >>>del s #删除s集合
集合删除异常:对象
>>> try: ... s.remove("444") ... except KeyError,e: ... print "not exists" ... else: ... print "success"
集合的替换:(没有修改,只有先删除再增长)
方法一:先删除再增长element
>>> s.remove("hig") >>> type(set("abc")) <type 'set'> >>> s.add("abc") >>> s set(['c', 'b', 'abc', 'y', 'x', 'z'])
方法二:先转换成列表,再修改rem
>>> t=list(s) >>> t.append(49) >>> ss=set(t) >>> ss set([49, 'add', '5', '4'])
setVar.discard(element)
参数说明: setVar :为一个set类型的变量 element :表示要查找并删除的元素 函数做用: 在集合setVar中查找element元素,若是存在则删除;若是没找到,则什么也不作。该函数没有返回值字符串
>>> sList=set([1,2,3,4,5]) >>> sList.discard(1) >>> sList.discard(1) >>> print sList set([2, 3, 4, 5])
(5)转换
集合与序列间的转换
集合和序列之间的转换跟序列之间互转是同样的,惟一不一样 的就是序列转成集合后,重复的元素被去掉了io
>>> testStr="python is good" >>> st=set(testStr) >>> print st set([' ', 'd', 'g', 'i', 'h', 'o', 'n', 'p', 's', 't', 'y'])
集合转字符串时,直接使用str()函 数进行转换,获得的将是集合的字 符串形式。要想真正转成字符串, 咱们须要借助字符串链接函数 join()函数来完成。ast
>>> s1="".join(st) #可是是无序的 >>> s1 ' dgihonpsty'
集合与列表互转
>>> listTest=[1,2,3,2,"a","b"] >>> sList=set(listTest) >>> sList set(['a', 1, 2, 3, 'b']) >>> list1=list(sList) >>> list1 ['a', 1, 2, 3, 'b']
元组与集合互转
>>> tupTest = (1, 2, 3, 2, 'a', 'b', 'a') >>> sTup=set(tupTest) >>> sTup set(['a', 1, 2, 3, 'b']) >>> tup=tuple(sTup) >>> tup ('a', 1, 2, 3, 'b')
(6)pop
>>> s.pop() 'h' >>> s.clear() >>> s set([])
注:pop是随机的若是想删除最后一个,若是想删除最后一个元素时,以下:
先遍历找到这个元素并记录下最后一个数值经过remove删除
>>> s set(['c', 'e', 'd', 'm', 'l', 'o', '4', 'w', 4]) >>> i=0 >>> value="" >>> for x in s: ... if i==8: ... value=x ... i+=1 ... >>> value 4 >>> s.remove(value)
(7)clear /copy/ len
sList=set([1,23,4,5]) >>> sList.clear() >>> print sList set([])
s2=set([1,2,3,4,5]) >>> s2=sList.copy() >>> id(s2) 4321621440 >>> id(sList) 4321422360
>>> len(s2) 0
(二)集合的类型操做符
(1)子集超集
“小于”符号( <, <= )用来判断子集
“大于”符号( >, >= )用来判断超集。
“小于” 和 “大于”意味着两个集合在比较时不能相等。等于号容许非严格定义的子集和超集。
Sets 支持严格( < )子集和非严格 ( <= ) 子集, 也支持严格( > )超集和非严格 ( >= )超集。只有当第一个集合是第二个集合的严格子集时,咱们才称第一个集合“小于”第二个集合,同理,只有当第一个集合是第二个集合的严格超集时,咱们才称第一个集合“大于”第二个集合。
>>> set('shop') < set('cheeseshop') True >>> set('bookshop') >= set('shop') True
(2)联合|(等价于union())
两个集合的联合是一个新集合,该集合中的每一个元素都至少是其中一个集合的成员,即,属于两个集合其中之一的成员。
>>> s=set("python") >>> t=set("hello") >>> s|t #等价于s.union(t) set(['p', 'e', 't', 'y', 'h', 'l', 'o', 'n'])
(3)交集&(等价于intersection())
两个集合的交集是一个新集合,该集合中的每一个元素同时是两个集合中的成员,即,属于两个集合的成员。
>>> s=set("python") >>> t=set("hello") >>>s&t #等价于 s.intersection(t) set(['h', 'o'])
(4)差补/相对补集(-)(等价于difference())
两个集合(s 和 t)的差补或相对补集是指一个集合 C,该集合中的元素,只属于集合 s,而不属于集合 t。
>>> s set(['h', 'o', 'n', 'p', 't', 'y']) >>> t set(['h', 'e', 'l', 'o']) >>> s-t set(['y', 'p', 't', 'n'])
(5)对称差分( ^ ) (等价于symmetric_difference())
两个集合(s 和 t)的对称差分是指另一个集合 C,该集合中的元素,只能是属于集合 s 或者集合 t的成员,不能同时属于两个集合。
set(['h', 'o', 'n', 'p', 't', 'y']) >>> t set(['h', 'e', 'l', 'o']) >>> s^t set(['e', 'l', 'n', 'p', 't', 'y'])
(6) issuperset方法所用是判断集合st1是不是集合st2的父集,若是是返回 True,不然返回False。
>>> s1=set([1,2,3,4]) >>> s2=set([2,3]) >>> s1.issuperset(s2)
True
(7) issubset函数的做用是判断集合s1是不是集合s2的子集,若是是返回True,不然返 回False。
>>> s1=set([1,2,3,4,5]) >>> s2=set([2,3]) >>> s2.issubset(s1) True
(8) 集合的成员运算符
集合里也可使用成员运算符,in和not in,判断某个对象是 否是集合中的成员。
s1 = set([“a”,”b”]) >>> "a" in s True >>> "x" in s False
(三) 不可变集合
Python中还有一种不可改变的集合,那就是 frozenset,不像set集合,可 以增长删除集合中的元素,该集合中的内容是不可改变的,相似于字符串、 元组。若是试图改变不可变集合中的元素,就会报AttributeError错误。 不可变集合,除了内容不能更改外,其余功能及操做跟可变集合set同样
f1 = f1=frozenset('python') print f1 f2 = frozenset([1,2,3,2,44,3]) print f2