在日常程式設計中,我們經常需要處理「唯一、不重複」的元素,或是快速檢查某個項目是否存在。
這時候,Python 的 集合 (set) 就是一個非常好用的工具。本篇將帶你了解集合的特性、使用方法與應用場景。
什麼是集合?
在 Python 中,集合(Set)是一種:
- 無序的資料結構
- 僅包含唯一元素(不允許重複)
- 可變的(可以添加或刪除元素)
- 支持數學集合運算(聯集、交集等)
凍結集合(Frozenset)則是集合的不可變版本,一旦創建就不能修改。
集合特別適合用於數據去重、成員檢測和數學集合運算,在處理大型數據集時尤其有用。

集合的實際應用
數據去重
將列表或其他可迭代對象轉換為集合,自動移除重複項
list_with_duplicates = [1, 2, 2, 3, 3, 3]
unique_items = set(list_with_duplicates)
# 結果: {1, 2, 3}
快速成員檢測
檢查元素是否存在於集合中的操作時間複雜度為 O(1)
music_genres = {'rock', 'jazz', 'classical'}
'rock' in music_genres # 結果: True
集合運算
執行數學集合運算,如找出兩個數據集的共同元素
user1_interests = {'chess', 'music', 'books'}
user2_interests = {'music', 'sports', 'cooking'}
common = user1_interests & user2_interests
創建集合的方法
使用大括號
music_genres = {'country', 'punk', 'rap', 'techno', 'pop'}
最常見的方法,但不能用空大括號創建空集合(會創建字典)
使用 set() 構造函數
music_genres = set(['country', 'punk', 'rap', 'techno'])
可以從任何可迭代對象創建集合,也是創建空集合的唯一方法:empty_set = set()
使用集合推導式
items = ['country', 'punk', 'rap', 'pop']
p_genres = {x for x in items if x[0] == 'p'}
類似列表推導式,可以在創建時進行篩選
集合可以包含不同的數據類型,前提是這些元素是可哈希的(不可變的):
mixed_set = {42, 'music', True, 3.14}
創建凍結集合
凍結集合(Frozenset)是不可變的集合,創建後無法修改其內容:
- 只能使用
frozenset()
構造函數創建 - 一旦創建,無法添加或刪除元素
- 可以作為字典的鍵或其他集合的元素
- 支持所有非修改性的集合操作
frozen_genres = frozenset(['rock', 'jazz', 'classical'])
empty_frozen = frozenset()
凍結集合特別適用於需要不可變集合的場景,如作為字典鍵或需要長期保持不變的數據集。

添加元素到集合
add() 方法
添加單個元素到集合
song_tags = {'country', 'folk'}
song_tags.add('acoustic')
song_tags.add('guitar')
# 結果: {'country', 'folk', 'acoustic', 'guitar'}
update() 方法
一次性添加多個元素
song_tags = {'country', 'folk'}
other_tags = ['live', 'blues']
song_tags.update(other_tags)
# 結果: {'country', 'folk', 'live', 'blues'}
重要注意事項:
- 添加重複元素不會改變集合(自動去重)
- 凍結集合(frozenset)不支持這些添加方法
- 集合是無序的,元素不會按添加順序排列
從集合中刪除元素
remove() 方法
刪除指定元素,如果元素不存在則引發 KeyError
錯誤
song_tags = {'guitar', 'acoustic', 'folk'}
song_tags.remove('folk')
# 結果: {'guitar', 'acoustic'}
# 以下代碼會引發錯誤
song_tags.remove('fiddle') # KeyError: 'fiddle'
discard() 方法
刪除指定元素,如果元素不存在則不執行任何操作(不報錯)
song_tags = {'guitar', 'acoustic', 'folk'}
song_tags.discard('guitar')
# 結果: {'acoustic', 'folk'}
# 以下代碼不會引發錯誤
song_tags.discard('fiddle') # 集合保持不變
在集合中查找元素
由於集合是無序的,我們不能通過索引訪問元素,但可以使用 in
關鍵字檢查元素是否存在:
song_tags = {'guitar', 'acoustic', 'folk', 'country'}
# 檢查元素是否存在
print('country' in song_tags) # 輸出: True
print('rock' in song_tags) # 輸出: False
這種成員檢測操作對集合和凍結集合都有效,且時間複雜度為 O(1),比列表的 O(n) 更高效。

集合運算
Python 集合支援數學集合的四大運算:
- 聯集 (Union):合併所有元素
a | b # 或 a.union(b)
- 交集 (Intersection):取出共同元素
a & b # 或 a.intersection(b)
- 差集 (Difference):只在第一個集合出現
a - b # 或 a.difference(b)
- 對稱差集 (Symmetric Difference):只在其中一個集合出現
a ^ b # 或 a.symmetric_difference(b)
結語
總結來說,我們已經掌握了集合的特性,以及如何透過各種方式創建與操作集合。這些基礎是理解集合更進階應用的前提。
接下來,我們將深入探討集合的數學運算,看看如何利用聯集、交集、差集與對稱差集,靈活處理更複雜的資料關聯。