本文為 容器型資料型態 介紹系列文,第 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: 5discard() 方法:
- 移除指定元素,如果元素不存在,不會引發錯誤。
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 編程中處理許多常見的數據處理問題,更加高效和優雅地編寫代碼。