集合去重:Python集合(set)的創建與常用操作

在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}

四、集合的特性(初學者必看)

  1. 無序性:集合不記錄元素的插入順序,因此無法通過索引訪問元素(比如 my_set[0] 會報錯)。
   my_set = {1, 2, 3}
   print(my_set[0])  # 報錯:TypeError: 'set' object is not subscriptable
  1. 元素不可變:集合中的元素必須是不可變類型(如數字、字符串、元組),不能包含列表、字典等可變類型。
   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())、集合運算(交集&、並集|、差集-)。
- 特性:無序性(無法索引)、元素不可變(不能含列表)。

通過多練習例子,你很快就能熟練運用集合解決去重和數據處理問題!

小夜