
在 Python 程式設計中,集合 (set) 是一種獨特的資料結構,用於儲存無序且不重複的元素。本文將詳細介紹 Python 集合的定義、建立方式、特性、基本操作、集合運算、常用方法,以及實際應用。
什麼是集合 (set)?
集合是由一群不重複的元素組成的無序資料結構。集合具有以下特點:
- 不重複性 (Unique Elements): 集合中不能包含重複的元素。如果嘗試新增重複的元素,集合會自動忽略。
- 無序性 (Unordered): 集合中的元素沒有固定的順序,因此不支援索引 (index) 操作。
- 可變性 (Mutable): 集合的內容可以修改 (新增、刪除元素)。
- 元素需可雜湊 (Hashable Elements): 集合中的元素必須是不可變的資料型別 (例如整數、字串、元組)。
不可變的集合 frozenset: Python 另有一個 frozenset 型別,它是不可變的集合,建立後就不能修改。因此,frozenset 可以當作另一個集合的元素,或是字典的鍵 (key)。
建立集合
有幾種方式可以建立集合:
- 使用大括號 {}: 將元素用逗號分隔,並放在大括號中。
- 使用 set() 函數: 傳入一個可迭代物件 (例如串列) 來建立集合,或建立一個空集合。
注意: 直接使用空的 {} 會建立一個空的「字典」,而不是空的「集合」。要建立空集合,必須使用 set()。
# 使用大括號 {}
# 重複的 'apple' 會被自動去除
fruits = {'apple', 'banana', 'orange', 'apple'}
print(fruits) # 輸出: {'orange', 'banana', 'apple'} (順序不一定)
# 使用 set() 函數
empty_set = set() # 正確建立空集合的方式
list_data = [10, 20, 30, 20, 10]
set_from_list = set(list_data) # 常用於列表去重
print(set_from_list) # 輸出: {10, 20, 30}
print(type(fruits)) # 輸出: <class 'set'>
集合的基本操作
- add(item): 新增單一元素。
- update(iterable): 新增多個元素。
my_set = {1, 2, 3}
my_set.add(4) # my_set is now {1, 2, 3, 4}
my_set.update([4, 5, 6]) # my_set is now {1, 2, 3, 4, 5, 6}
print(my_set)
- remove(item): 刪除指定元素,若元素不存在會引發 KeyError。
- discard(item): 刪除指定元素,若元素不存在則不做任何事 (更安全)。
- pop(): 隨機移除並返回一個元素。
- clear(): 清空集合。
s = {1, 2, 3, 4, 5}
s.remove(3) # s is now {1, 2, 4, 5}
s.discard(10) # 10 不存在,但不會報錯
item = s.pop() # 隨機移除一個元素
print(f"Popped item: {item}")
print(f"Set after pop: {s}")
- in / not in: 檢查元素是否存在。
- len(set): 計算集合長度。
s = {10, 20, 30}
print(f"Is 20 in set? {20 in s}") # True
print(f"Length of set: {len(s)}") # 3
集合運算 (Set Operations)
Python 集合支援各種數學上的集合運算,非常強大。
運算 | 符號 | 方法 | 說明 |
---|---|---|---|
聯集 | | | .union() | 包含兩個集合中所有不重複的元素。 |
交集 | & | .intersection() | 包含同時存在於兩個集合中的元素。 |
差集 | - | .difference() | 包含存在於第一個集合但不存在於第二個集合的元素。 |
對稱差集 | ^ | .symmetric_difference() | 包含只存在於其中一個集合的元素。 |
子集/超集 | <=, <, >=, > | .issubset(), .issuperset() | 判斷集合間的包含關係。 |
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
# 聯集
print(f"Union: {set1 | set2}") # {1, 2, 3, 4, 5, 6, 7, 8}
# 交集
print(f"Intersection: {set1 & set2}") # {4, 5}
# 差集
print(f"Difference (set1 - set2): {set1 - set2}") # {1, 2, 3}
# 對稱差集
print(f"Symmetric Difference: {set1 ^ set2}") # {1, 2, 3, 6, 7, 8}
frozenset (凍結集合)
Python 提供了一種不可變的集合型別 frozenset。它一旦建立後,就不能再新增或刪除元素。這使得 frozenset 可以作為字典的鍵或另一個集合的元素。
# 建立 frozenset
frozen_set = frozenset([1, 2, 3, 2])
print(frozen_set) # 輸出: frozenset({1, 2, 3})
# frozenset 可以作為字典的鍵
my_dict = {frozen_set: 'This is a key'}
print(my_dict[frozen_set])
# 以下操作會引發錯誤
# frozen_set.add(4) # AttributeError
集合的應用
- 去除重複元素: 將串列或其他可迭代物件轉換為集合,是 Python 中最快且最簡潔的去重方法。
- 成員資格測試: 快速判斷一個元素是否存在於一個龐大的資料集合中 (in 和 not in 運算)。其效率遠高於在串列中查找。
- 集合運算: 進行交集、聯集、差集等操作,例如,找出兩群使用者共同的朋友、比較文件版本的差異等。
總結
Python 的集合 (set) 是一種基於「不重複」和「無序」特性的資料結構,它提供了高效的成員資格測試和強大的集合運算功能。了解集合的用法,尤其是在需要處理唯一元素和進行資料比對的場景時,可以幫助您寫出更簡潔、更高效能的程式碼。同時,理解可變的 set 與不可變的 frozenset 的差異與應用,能讓您的程式設計工具箱更加完備。