Set 翻成中文就是「集合」,就是我們數學上說的「集合」。
數學的集合具備以下的特性:
{1, 2, 3, 4, 3, 4} = {1, 2, 3, 4}
{1, 3, 5} = {1, 5, 3}
因為上述這些特性,Python 中的集合有以下的特性:
列表最顯眼的地方是[]
;集合最顯眼的地方則是{}
!
不同於字典的地方是:集合內的元素僅用逗點分開(沒有鍵值存在,因此也無需冒號)
集合內的元素資料可以是任何資料型態。
宣告一個集合:
s = {1, 2, 3, 1, 2,'a','a'}
print(s)
因為集合有「無序性」,也許得到的結果不是
{1, 2, 3, 'a'}
但是一定是由這四個元素排列可以得出的集合
利用函式 set()
建構集合,也可以想成強制轉型!
tupleToSet = set((1, 2, 2))
listToSet = set([1,2,3,3])
print(tupleToSet)
print(listToSet)
特別注意的是這個函式要求一個參數傳入
所以在宣告tupleToSet
這個變數時,需要使用雙層括號(內層括號代表tuple
)
剛才有提到集合不包含鍵值或索引值,所以我們不能用 set[0]
或 set['key']
來取得元素,唯一的辦法就是使用迴圈迭代集合元素!
mySet = {1,2,3,5,3,3}
for element in mySet:
print(element, end=" ")
另一個問題是「可以改變集合元素嗎」?不行。
因為我們只能以迭代取得元素,我們又知道改變迭代的值,不影響原本元素的值,
因此一旦將元素新增至集合就不能被更改,僅能刪去這個元素後,在新增新的元素。
因為集合是無序的,所以新增資料也不需區分push_front()
, push_back()
。
集合提供一種方法來新增資料:set.add(element)
mySet = {1,2,3}
mySet.add(4)
print(mySet)
mySet.add(2)
print(mySet)
如果欲新增的資料已經存在於集合,則不會被新增。
可以使用len(set)
來取得集合長度,成功新增元素,集合長度會增加
若需一次新增多筆資料,則可以使用 set.update()
由於這個函式僅要求一個參數,所以我們必須先將這些資料包裝成一個集合、列表等型態。
mySet = {1,2,3,2,4}
mySet.update([5,6])
print(mySet)
如果了解數學的集合概念,你會發現 set.update()
與 set.union()
功能其實是相等。
mySet = {1,2,3,2,4}
mySet.union({1,5,6})
print(mySet)
大致分成以下幾種:
set.remove(target)
:
set.discard(target)
:
popped = set.pop()
:
set.clear()
:
del set
:
Method | 回傳值 | 功能 |
---|---|---|
set.copy() |
set | 複製 |
set1.difference(set2) |
set | set1 - set2 |
set1.difference_update(set2) |
None | set1 -= set2 |
set1.intersection(set2) |
set | set1 交集 set2 |
set1.intersection_update(set2) |
None | set1 更新為 set1 交集 set2 |
set1.isdisjoint(set2) |
bool | set1 是否與 set2 互斥 |
set1.issubset(set2) |
bool | set1 是否為 set2 的子集合 |
set1.symmetric_difference(set2) |
set | set1 與 set2 對稱差 |
set1.symmetric_difference_update(set2) |
None | set1 更新為 set1 與 set2 對稱差 |
雖然集合少去了索引值和鍵值,導致變化較少,但是不可否認的是集合是一種會被經常運用的資料型態。
Python 的內建資料型態大致已經介紹完畢,接下來我們要來實作一些資料型態,例如:鏈結串列、二元樹等。