Python 集合(Set)詳解:新手指南
更新日期: 2025 年 1 月 22 日
本文為 容器型資料型態 介紹系列文,第 4 篇:
在 Python 編程中,集合(Set) 是一種非常有用的數據結構,用於存儲多個不重複的元素。
集合提供了高效的成員測試以及數學集合運算,如聯集、交集和差集。
對於剛開始學習 Python 的新手來說,理解並掌握集合的概念和用法,將有助於編寫更高效、簡潔的代碼。
本文將詳細介紹 Python 中的集合,包括其基本概念、創建方式、基本操作、集合方法以及實際應用,幫助您在實際開發中靈活運用。
什麼是集合?
集合(Set) 是 Python 中的一種內建數據結構,用於存儲 無序的、無重複元素 的集合。
集合的主要特點是:
- 元素唯一:集合中不存在相同的元素。
- 無序性:集合中的元素沒有特定的順序,無法通過索引訪問。
集合在許多情況下都非常有用,特別是在需要確保數據的唯一性或進行集合運算(如聯集、交集)時。
創建集合
使用大括號 {}
創建集合
可以使用大括號 {}
來創建集合,集合中的元素用逗號 ,
分隔。
示例:
my_set = {1, 2, 3}
print(my_set) # 輸出:{1, 2, 3}
注意:
- 空的大括號
{}
創建的是 字典(dict),而不是集合。 - 創建空集合需要使用
set()
函數。
使用 set()
函數創建集合
使用 set()
函數可以創建集合,特別是當需要創建空集合時。
創建空集合:
empty_set = set()
print(empty_set) # 輸出:set()
從其他可迭代物件創建集合:
my_list = [1, 2, 2, 3, 4]
my_set = set(my_list)
print(my_set) # 輸出:{1, 2, 3, 4}
集合的特性
無序性
集合是無序的,這意味著:
- 無法通過索引訪問集合中的元素。
- 集合的元素順序可能與添加順序不同。
示例:
my_set = {3, 1, 4, 2}
print(my_set) # 輸出可能是:{1, 2, 3, 4}
元素的唯一性
集合中的元素必須是唯一的,重複的元素會被自動去除。
示例:
my_set = {1, 2, 2, 3}
print(my_set) # 輸出:{1, 2, 3}
基本集合操作
添加元素
使用 add()
方法可以向集合中添加元素。
示例:
my_set = {1, 2, 3}
my_set.add(4)
print(my_set) # 輸出:{1, 2, 3, 4}
注意:
- 如果添加的元素已存在,集合不會改變。
移除元素
可以使用 remove()
或 discard()
方法移除元素。
remove()
方法:
- 移除指定元素,如果元素不存在,會引發
KeyError
。
my_set = {1, 2, 3}
my_set.remove(2)
print(my_set) # 輸出:{1, 3}
# my_set.remove(5) # KeyError: 5
discard()
方法:
- 移除指定元素,如果元素不存在,不會引發錯誤。
my_set.discard(5) # 不會引發錯誤
pop()
方法:
- 隨機移除並返回一個元素,集合為空時引發
KeyError
。
element = my_set.pop()
print(element)
print(my_set)
成員測試
使用 in
關鍵字可以測試元素是否在集合中。
示例:
my_set = {1, 2, 3}
print(2 in my_set) # 輸出:True
print(5 not in my_set) # 輸出:True
集合之間的運算
集合支持許多標準的集合運算,如聯集、交集、差集和對稱差集。
聯集
- 運算符:
|
- 方法:
union()
- 作用: 返回兩個集合的所有元素(不重複)。
示例:
set_a = {1, 2, 3}
set_b = {3, 4, 5}
# 使用運算符
set_union = set_a | set_b
print(set_union) # 輸出:{1, 2, 3, 4, 5}
# 使用方法
set_union = set_a.union(set_b)
print(set_union) # 輸出:{1, 2, 3, 4, 5}
交集
- 運算符:
&
- 方法:
intersection()
- 作用: 返回兩個集合的共同元素。
示例:
set_a = {1, 2, 3}
set_b = {3, 4, 5}
set_intersection = set_a & set_b
print(set_intersection) # 輸出:{3}
差集
- 運算符:
-
- 方法:
difference()
- 作用: 返回在第一個集合但不在第二個集合中的元素。
示例:
set_a = {1, 2, 3}
set_b = {3, 4, 5}
set_difference = set_a - set_b
print(set_difference) # 輸出:{1, 2}
對稱差集
- 運算符:
^
- 方法:
symmetric_difference()
- 作用: 返回兩個集合中不重複的元素(非共同元素)。
示例:
set_a = {1, 2, 3}
set_b = {3, 4, 5}
set_sym_diff = set_a ^ set_b
print(set_sym_diff) # 輸出:{1, 2, 4, 5}
集合方法
集合提供了一系列的方法,用於集合的操作和處理。
add(element)
:添加元素到集合。remove(element)
:移除指定元素,元素不存在時引發錯誤。discard(element)
:移除指定元素,元素不存在時不引發錯誤。pop()
:隨機移除並返回一個元素。clear()
:清空集合。copy()
:返回集合的淺拷貝。update(other_set)
:使用其他集合的元素更新當前集合(聯集)。intersection_update(other_set)
:保留與其他集合的共同元素(交集)。difference_update(other_set)
:移除存在於其他集合的元素(差集)。symmetric_difference_update(other_set)
:保留兩個集合中不重複的元素(對稱差集)。
示例:
set_a = {1, 2, 3}
set_b = {3, 4, 5}
set_a.update(set_b)
print(set_a) # 輸出:{1, 2, 3, 4, 5}
不可變集合 frozenset
frozenset
是不可變的集合,一旦創建就不能修改。它可以用作字典的鍵或其他集合的元素。
創建 frozenset
:
immutable_set = frozenset([1, 2, 3])
print(immutable_set) # 輸出:frozenset({1, 2, 3})
特點:
- 不可變性:無法添加、移除元素。
- 支持集合運算:可以進行聯集、交集等運算,但結果是新的集合。
示例:
set_a = frozenset([1, 2, 3])
set_b = frozenset([3, 4, 5])
set_union = set_a | set_b
print(set_union) # 輸出:frozenset({1, 2, 3, 4, 5})
集合的實際應用示例
去除列表中的重複元素
使用集合可以輕鬆去除列表中的重複元素。
示例:
my_list = [1, 2, 2, 3, 4, 4, 5]
unique_list = list(set(my_list))
print(unique_list) # 輸出:[1, 2, 3, 4, 5]
集合的成員測試效率
集合的成員測試(in
操作)效率比列表高,因為集合使用了雜湊表結構。
示例:
my_set = {i for i in range(1000000)}
print(999999 in my_set) # 輸出:True
注意事項
- 集合的元素必須是可雜湊的(不可變的):
- 例如,列表、字典等可變類型不能作為集合的元素。
- 可以使用元組(tuple)作為集合的元素。 示例:
my_set = {(1, 2), (3, 4)}
# my_set = {[1, 2], [3, 4]} # TypeError: unhashable type: 'list'
- 集合是無序的:
- 無法保證元素的順序,如果需要有序的集合,可以使用
collections.OrderedDict
或其他方法。
- 空集合的創建:
- 使用
{}
創建的是空字典,創建空集合需要使用set()
。 示例:
empty_set = set()
empty_dict = {}
print(type(empty_set)) # 輸出:<class 'set'>
print(type(empty_dict)) # 輸出:<class 'dict'>
總結
- 集合(Set) 是無序且元素唯一的數據結構,適用於存儲不重複的元素和進行集合運算。
- 創建集合:
- 使用大括號
{}
創建集合,但空集合需要使用set()
。 - 使用
set()
函數將其他可迭代物件轉換為集合。
- 使用大括號
- 基本操作:
- 添加元素:
add()
- 移除元素:
remove()
、discard()
、pop()
- 成員測試:使用
in
關鍵字
- 添加元素:
- 集合運算:
- 聯集:
|
或union()
- 交集:
&
或intersection()
- 差集:
-
或difference()
- 對稱差集:
^
或symmetric_difference()
- 聯集:
- 不可變集合:
- 使用
frozenset
創建不可變集合,用於需要不可變集合的場合。
- 使用
- 實際應用:
- 去除重複元素
- 高效的成員測試
- 集合間的運算(如標籤、標識的處理)
透過學習和掌握集合,您可以在 Python 編程中處理許多常見的數據處理問題,更加高效和優雅地編寫代碼。