python-資料型別之set集合

曉楠南發表於2019-02-16
集合set是Python中一種基本資料型別,它分為可變集合(set)和不可變集合(frozenset)兩種。類似於其他語言,集合是一個無序不重複元素集,包括建立集合set、向集合中新增元素、刪除集合中的元素、求集合的交集、並集、差集等操作

(一)集合的增刪改查
(1)集合的建立與賦值——唯一的方法工廠方法 set()和 frozenset()

>>> 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)訪問集合的值
遍歷檢視集合成員或檢查某項元素是否是一個集合中的成員:

>>> 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 將他們直接清除出當前的名字空間。

>>> 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"

集合的替換:(沒有修改,只有先刪除再增加)
方法一:先刪除再增加

>>> s.remove("hig")
>>> type(set("abc"))
<type `set`>
>>> s.add("abc")
>>> s
set([`c`, `b`, `abc`, `y`, `x`, `z`])

方法二:先轉換成列表,再修改

>>> 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)轉換
集合與序列間的轉換
集合和序列之間的轉換跟序列之間互轉是一樣的,唯一不同 的就是序列轉成集合後,重複的元素被去掉了

>>> testStr="python is good"
>>> st=set(testStr)
>>> print st
set([` `, `d`, `g`, `i`, `h`, `o`, `n`, `p`, `s`, `t`, `y`])

集合轉字串時,直接使用str()函 數進行轉換,得到的將是集合的字 符串形式。要想真正轉成字串, 我們需要藉助字串連線函式 join()函式來完成。

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

相關文章