iT邦幫忙

2022 iThome 鐵人賽

DAY 10
0

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 的內建資料型態大致已經介紹完畢,接下來我們要來實作一些資料型態,例如:鏈結串列、二元樹等。


上一篇
[Day 09] 闖進Python異世界 - Methods of Dictionary
下一篇
[Day 11] 闖進Python異世界 - Class 你會開模嗎?
系列文
闖進Python異世界30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言