Python set represented as a container with unique diverse objects inside

掌握 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)

結語

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

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

發佈留言

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

High Quality

Lorem ipsum dolor sit amet, consectetur adipiscing elitsed do eiusmod tempor.

Fast Delivery

Lorem ipsum dolor sit amet, consectetur adipiscing elitsed do eiusmod tempor.

Best Warranty

Lorem ipsum dolor sit amet, consectetur adipiscing elitsed do eiusmod tempor.