在Python中,我們經常會遇到需要去除重複元素的情況,比如處理一份有重複記錄的數據列表。這時候,集合(set) 就是一個非常實用的工具。它最顯著的特點就是元素不重複,並且是無序的。通過集合,我們可以輕鬆實現數據去重,同時還能進行交集、並集等集合運算。
一、爲什麼用集合去重?¶
假設我們有一個列表 [1, 2, 2, 3, 3, 3],如果想去除重複元素,用列表實現可能需要寫循環或者列表推導式(比如 list(set([1,2,2,3,3,3]))),而集合的去重更直接——一行代碼就能搞定,而且邏輯更清晰。
二、創建集合(Set)¶
1. 直接用大括號 {} 創建¶
集合用大括號 {} 定義,元素之間用逗號分隔。但要注意:集合中的元素不能重複,重複的元素會自動被忽略。
# 定義一個包含重複元素的集合
my_set = {1, 2, 3, 2, 3}
print(my_set) # 輸出:{1, 2, 3}(重複元素被自動去重)
2. 用 set() 函數創建¶
如果需要將其他可迭代對象(如列表、元組)轉換爲集合,用 set() 函數更方便。
# 從列表創建集合(自動去重)
my_list = [1, 2, 2, 3, 4]
my_set = set(my_list)
print(my_set) # 輸出:{1, 2, 3, 4}
注意:空集合的創建¶
- 不能用
{}表示空集合,因爲{}是空字典(後續會介紹字典)。 - 空集合必須用
set()創建:
empty_set = set()
print(empty_set) # 輸出:set()
三、集合的常用操作¶
1. 基本操作:添加和刪除元素¶
- 添加元素:用
add()方法添加單個元素。
my_set = {1, 2, 3}
my_set.add(4) # 添加元素4
print(my_set) # 輸出:{1, 2, 3, 4}
- 刪除元素:用
remove()或discard()方法。 remove(x):如果元素x不存在,會報錯。discard(x):如果元素x不存在,不會報錯(更安全)。
my_set = {1, 2, 3}
my_set.remove(2) # 刪除元素2
print(my_set) # 輸出:{1, 3}
my_set.discard(5) # 刪除不存在的元素5,無報錯
print(my_set) # 輸出:{1, 3}
- 隨機刪除:用
pop()方法(集合無序,所以隨機刪除一個元素)。
my_set = {1, 2, 3}
removed = my_set.pop() # 隨機刪除一個元素(返回被刪除的元素)
print(my_set) # 輸出:{2, 3}(假設刪除了1)
print(removed) # 輸出:1(被刪除的元素)
2. 集合運算(去重後的數據處理)¶
集合的核心功能之一是處理數據間的關係,比如交集、並集、差集。這些運算可以用符號或方法實現,以下是常見場景:
- 交集(Intersection):同時存在於兩個集合中的元素。
- 符號:
&或方法intersection()
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
# 交集:{3, 4}
print(a & b) # 輸出:{3, 4}
print(a.intersection(b)) # 輸出:{3, 4}
- 並集(Union):兩個集合中所有元素的合併(去重)。
- 符號:
|或方法union()
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
# 並集:{1, 2, 3, 4, 5, 6}
print(a | b) # 輸出:{1, 2, 3, 4, 5, 6}
print(a.union(b)) # 輸出:{1, 2, 3, 4, 5, 6}
- 差集(Difference):屬於第一個集合但不屬於第二個集合的元素。
- 符號:
-或方法difference()
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
# 差集:{1, 2}(a中有但b中沒有的元素)
print(a - b) # 輸出:{1, 2}
print(a.difference(b)) # 輸出:{1, 2}
四、集合的特性(初學者必看)¶
- 無序性:集合不記錄元素的插入順序,因此無法通過索引訪問元素(比如
my_set[0]會報錯)。
my_set = {1, 2, 3}
print(my_set[0]) # 報錯:TypeError: 'set' object is not subscriptable
- 元素不可變:集合中的元素必須是不可變類型(如數字、字符串、元組),不能包含列表、字典等可變類型。
invalid_set = {[1, 2], 3} # 報錯:TypeError: unhashable type: 'list'
五、實戰案例:列表去重¶
用集合實現列表去重非常簡單,只需將列表轉爲集合,再轉回列表即可:
# 原始列表(有重複元素)
my_list = [1, 2, 2, 3, 3, 3, 4]
# 集合去重 + 轉回列表
unique_list = list(set(my_list))
print(unique_list) # 輸出:[1, 2, 3, 4](注意:順序可能隨機,因爲集合無序)
如果需要保持原順序(Python 3.7+),可以結合列表推導式和集合去重:
seen = set()
unique_list = [x for x in my_list if not (x in seen or seen.add(x))]
print(unique_list) # 輸出:[1, 2, 3, 4](保持原順序)
總結¶
集合(set)是Python中處理無序、不重複數據的利器,尤其適合去重和集合運算。掌握以下關鍵點:
- 創建:用 {} 或 set(),注意空集合只能用 set()。
- 去重:直接 list(set(重複列表)) 一行搞定。
- 操作:添加(add())、刪除(remove()/discard())、集合運算(交集&、並集|、差集-)。
- 特性:無序性(無法索引)、元素不可變(不能含列表)。
通過多練習例子,你很快就能熟練運用集合解決去重和數據處理問題!