集合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