Python 集合 (set) 型別詳解:建立、操作、方法與應用

Python 集合 (set) 型別詳解:建立、操作、方法與應用 - CCC Blog
兩個圓圈交疊的文氏圖 (Venn diagram),象徵著 Python 集合的交集、聯集等運算。

在 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 中最快且最簡潔的去重方法。
  • 成員資格測試: 快速判斷一個元素是否存在於一個龐大的資料集合中 (innot in 運算)。其效率遠高於在串列中查找。
  • 集合運算: 進行交集、聯集、差集等操作,例如,找出兩群使用者共同的朋友、比較文件版本的差異等。

總結

Python 的集合 (set) 是一種基於「不重複」和「無序」特性的資料結構,它提供了高效的成員資格測試和強大的集合運算功能。了解集合的用法,尤其是在需要處理唯一元素和進行資料比對的場景時,可以幫助您寫出更簡潔、更高效能的程式碼。同時,理解可變的 set 與不可變的 frozenset 的差異與應用,能讓您的程式設計工具箱更加完備。

較新的 較舊