python-數據類型之set集合

集合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
相關文章
相關標籤/搜索