掌握 Python 集合(Set)(13):快速判斷與去重的最佳工具

在日常程式設計中,我們經常需要處理「唯一、不重複」的元素,或是快速檢查某個項目是否存在。

這時候,Python 的 集合 (set) 就是一個非常好用的工具。本篇將帶你了解集合的特性、使用方法與應用場景。

什麼是集合?

在 Python 中,集合(Set)是一種:

  • 無序的資料結構
  • 僅包含唯一元素(不允許重複)
  • 可變的(可以添加或刪除元素)
  • 支持數學集合運算(聯集、交集等)

凍結集合(Frozenset)則是集合的不可變版本,一旦創建就不能修改。

集合特別適合用於數據去重、成員檢測和數學集合運算,在處理大型數據集時尤其有用。

Python set represented as a container with unique diverse objects inside

集合的實際應用

數據去重

將列表或其他可迭代對象轉換為集合,自動移除重複項

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()

凍結集合特別適用於需要不可變集合的場景,如作為字典鍵或需要長期保持不變的數據集。

A frozen crystal cube containing musical notes representing immutable frozenset in Python

添加元素到集合

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) 更高效。

Magnifying glass searching for an element in a set of diverse objects

集合運算

Python 集合支援數學集合的四大運算:

  1. 聯集 (Union):合併所有元素a | b # 或 a.union(b)
  2. 交集 (Intersection):取出共同元素a & b # 或 a.intersection(b)
  3. 差集 (Difference):只在第一個集合出現a - b # 或 a.difference(b)
  4. 對稱差集 (Symmetric Difference):只在其中一個集合出現a ^ b # 或 a.symmetric_difference(b)

結語

總結來說,我們已經掌握了集合的特性,以及如何透過各種方式創建與操作集合。這些基礎是理解集合更進階應用的前提。

接下來,我們將深入探討集合的數學運算,看看如何利用聯集、交集、差集與對稱差集,靈活處理更複雜的資料關聯。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

返回頂端