今天速速進入正題,相較於 List 與 Tuple,集合 Set 內每個儲存的元素都必須是獨一無二的,另外也因為 Set 沒有所謂的順序,自然也就不能使用索引值進行取出指定的元素或是進行切片。
一如前面的 list 與 tuple,set 也可以使用類別 set()
或是大括號 {}
創建,不過若是選擇使用 set()
創建類別,記得裡面的放入的引數必須是個「可以迭代的物件」。
# 創建一個空集合
set1 = set()
# 創建一個集合裡面有 "h" "a" "p" "y" 這幾個元素
set2 = set("happy")
print(set2) # {'y', 'a', 'h', 'p'},因為 set 沒有排序性
# 使用大括號創建集合
set3 = {'banana', 'orange', 'mango', 'lemon'}
print(set3) # {'mango', 'banana', 'orange', 'lemon'}
要特別注意的事,如果使用 set4 = {}
,這樣並「不會」創建一個空集合,反而會創造出我們還沒有講到的另一種資料型態——字典 dictionary。
講到刪除,我們也可以使用前幾天都有提及的關鍵字 del
刪除指定的 set。
fruits = {'banana', 'orange', 'mango', 'lemon'}
del fruits
print(fruits) # NameError: name 'fruits' is not defined
雖然說 set 沒有順序,但我們仍然可以使用 len()
方法得知其長度。
fruits = {'banana', 'orange', 'mango', 'lemon'}
print(len(fruits)) # 4
稍早不是才說由於 set 集合沒有索引值,所以我們也無法透過索引值取得指定的元素,但這並不代表我們不能取得 set 裡面的元素。(怎麼好像在繞口令?)
精準來說,我們可以透過迴圈 for loop的方式取得 set 中的所有元素。(這邊也還沒有說到迴圈 for loop,所以先看過就好。)
fruits = {'banana', 'orange', 'mango', 'lemon'}
for fruit in fruits:
print(fruit) # 這邊會一個一個印出 fruits 裡所有的元素
同樣地,我們也可以使用 in
運算子查找 set 裡面有沒有指定的元素,而查找的結果則會返回一個布林值。
fruits = {'banana', 'orange', 'mango', 'lemon'}
print("mango" in fruits) # True
print("lime" in fruits) # False
我們可以使用 add()
或是 update()
方法來新增元素至集合,不過這兩種方法有些差異,如果使用 add()
只能一次新增一個元素至 set,而 update()
雖然可以一次新增多個元素,但 update()
裡面的引數必須是一個串列 list,讓我們直接看原始碼。
使用 add()
方法
fruits = {'banana', 'orange', 'mango', 'lemon'}
fruits.add("lime")
print(fruits) # {'lemon', 'lime', 'orange', 'banana', 'mango'}
使用 update()
方法
fruits = {'banana', 'orange', 'mango', 'lemon'}
fruits.update(["grape", "apple"])
print(fruits) # {'lemon', 'grape', 'apple', 'orange', 'banana', 'mango'}
我們也可透過 remove()
跟 discard()
來移除集合裡面的指定元素,兩者的功用近乎相同,但仍有些微的差異。
使用 remove()
時要特別注意,如果集合裡面沒有將要刪除的指定元素,此時 Python 會引起(拋出)錯誤,也就是所謂的 raise error。
使用 remove()
方法
fruits = {'banana', 'orange', 'mango', 'lemon'}
fruits.remove("banana")
print(fruits) # {'lemon', 'orange', 'mango'}
fruits.remove("apple") # 因為 fruits 裡面沒有 apple,所以會引發錯誤,而原本的集合也不會有所改變。
使用 discard()
方法
fruits = {'banana', 'orange', 'mango', 'lemon'}
fruits.discard("banana")
print(fruits) # {'lemon', 'orange', 'mango'}
fruits.discard("apple") # 雖然 fruits 裡面沒有 apple,但也不會引發任何錯誤,什麼事情都不會發生與改變。
其實 Set 作為可以儲存多個元素的資料型態,不僅可以過濾掉重複的元素,也可以查找兩個集合的交集、差集等,藉此來比較兩個資料的內容。
在複習過程中,有時候會納悶「為什麼有些 Python 的資料型態這麼少用到?」,像我自己學習到現在,使用集合 set 的次數寥寥可數,不過現在回憶起,或許有些情境是可以改使用 set 以增加程式效率,學習語言像是擴充自己的工具箱,但工具箱裡的工具擴衝後,我們多數時候還是會挑選自己習慣的工具做使用,只有透由刻意使用,才會內化成技巧的一部分。