Python 資料結構:數據組織與操作 (第 4 章)

站主自己的課程,請大家支持
揭秘站長的架站心法:如何利用 Hugo × AI 打造高質感個人品牌網站? 揭秘站長的架站心法:如何利用 Hugo × AI 打造高質感個人品牌網站?
  • Post by
  • Dec 18, 2023
post-thumb

資料結構 (Data Structures) 是電腦科學的核心,它決定了我們如何儲存、組織與存取數據。Python 提供了四種強大且靈活的內建容器:List, Tuple, Set, Dictionary

選擇正確的資料結構不僅能讓程式碼更簡潔,更能顯著提升執行效能 (例如:在百萬筆數據中搜尋,Set 比 List 快上數千倍)。本章將深入剖析這四大天王。

1. 列表 (List):有序且可變的序列

List 是 Python 最常用的資料結構,類似於其他語言的 Array,但更靈活(可容納不同型別)。

  • 特性: 有序 (Ordered)、可變 (Mutable)、允許重複值。
  • 語法: []list()
fruits = ["apple", "banana", "cherry"]
fruits.append("date")      # 新增
fruits[1] = "blueberry"    # 修改
del fruits[0]              # 刪除

1.1 List 記憶體機制與效能

Python 的 List 實際上是「動態陣列 (Dynamic Array)」,儲存的是物件的參照 (Reference)。

  • 隨機存取 (Access): O(1) - 非常快。
  • 尾部新增 (Append): O(1) - 快。
  • 插入/刪除 (Insert/Delete): O(N) - 慢(因為需要移動後續所有元素)。
index 0
index 1
index 2
List 參照表
Obj: 'apple'
Obj: 'banana'
Obj: 'cherry'

1.2 進階操作:切片 (Slicing)

nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

print(nums[2:5])   # [2, 3, 4] (不包含結尾索引)
print(nums[:3])    # [0, 1, 2] (從頭開始)
print(nums[::2])   # [0, 2, 4, 6, 8] (步長為 2)
print(nums[::-1])  # [9, 8, ..., 0] (反轉)

2. 元組 (Tuple):不可變的序列

Tuple 可以視為「唯讀的 List」。一旦建立,就不能修改(新增、刪除、賦值)。

  • 特性: 有序、不可變 (Immutable)、記憶體佔用較少。
  • 語法: ()tuple()

為什麼需要 Tuple?

  1. 安全性: 保證數據不會被意外修改(適合設定檔、常數)。
  2. 雜湊性 (Hashable): 因為不可變,所以可以作為 Dictionary 的 Key 或 Set 的元素(List 不行)。
  3. 效能: 建立與存取速度略快於 List。

Tuple Packing & Unpacking

# Packing
coordinates = 10, 20  # 括號可省略

# Unpacking
x, y = coordinates
print(x, y)  # 10 20

# 交換變數 (Pythonic Way)
a, b = 1, 2
a, b = b, a  # 背後就是利用 Tuple Packing/Unpacking

3. 集合 (Set):無序且不重複

Set 是基於雜湊表 (Hash Table) 實作的,專門用於處理「唯一性」與「數學集合運算」。

  • 特性: 無序 (Unordered)、不重複 (Unique)、元素必須 Hashable。
  • 語法: {}set() (注意:空集合必須用 set(), {} 是空字典)

3.1 數學集合運算

這是 Set 最強大的功能。

a = {1, 2, 3, 4}
b = {3, 4, 5, 6}

print(a | b)  # 聯集 (Union): {1, 2, 3, 4, 5, 6}
print(a & b)  # 交集 (Intersection): {3, 4}
print(a - b)  # 差集 (Difference): {1, 2} - 屬於 a 但不屬於 b
print(a ^ b)  # 對稱差集 (Symmetric Diff): {1, 2, 5, 6}

3.2 效能優勢:O(1) 搜尋

in 運算符在 Set 中是 O(1),而在 List 中是 O(N)。當數據量大時,差異巨大。

Tips: 若需要去除 List 中的重複元素,最快的方法是 list(set(my_list))

4. 字典 (Dictionary):鍵值對應

Dict 是 Python 中最強大的資料結構,同樣基於雜湊表。

  • 特性: 鍵值對 (Key-Value)、可變、Key 必須唯一且 Hashable。
  • 語法: {key: value}dict()

4.1 核心操作

user = {"name": "Alice", "age": 25}

# 存取 (建議用 get 以避免 KeyError)
print(user.get("height", 170))  # 若 key 不存在,回傳預設值 170

# 新增/修改
user["email"] = "alice@example.com"

# 刪除
email = user.pop("email")

4.2 有序字典 (自 Python 3.7+)

在舊版 Python 中,Dict 是無序的。但從 Python 3.7 開始,Dict 保證插入順序。這對資料處理流程非常重要。

5. 四大結構綜合比較表

特性List ([])Tuple (())Set ({})Dict ({k:v})
有序性✅ 有序✅ 有序❌ 無序✅ 有序 (3.7+)
可變性✏️ Mutable🔒 Immutable✏️ Mutable✏️ Mutable
重複值✅ 允許✅ 允許❌ 不允許Key 不允許
存取方式Index [i]Index [i]Key (Hash)Key [k]
搜尋速度🐢 O(N)🐢 O(N)⚡ O(1)⚡ O(1)
主要用途一般序列數據固定數據結構去重、集合運算關聯數據、查詢表

6. 常見問題 (FAQ)

Q1: 什麼是 Hashable (可雜湊)?

A: 一個物件如果有一個在其生命週期內不會改變的雜湊值 (Hash Value),它就是 Hashable 的。所有的不可變型別 (int, float, str, tuple) 都是 Hashable 的,而可變型別 (list, dict, set) 則不是。只有 Hashable 的物件才能作為 Set 的元素或 Dict 的 Key。

Q2: 什麼時候該用 Tuple 而不是 List?

A:

  1. 資料不應被改變:如一周的七天、地理座標 (lat, long)。
  2. 作為 Dict Key:因為 List 不可雜湊,無法當 Key,但 Tuple 可以。
  3. 效能微優化:在創建大量小型陣列時,Tuple 稍快且省記憶體。

Q3: 如何合併兩個字典?

A: Python 3.9+ 引入了合併運算子 |

x = {"a": 1}
y = {"b": 2}
z = x | y  # {"a": 1, "b": 2}

舊版本需使用 {**x, **y}x.update(y)

7. 總結

  • 資料結構是程式設計的基石。
  • 需要修改、排序的序列 -> List
  • 不可變的資料、結構化紀錄 -> Tuple
  • 需要去重、快速成員檢查 -> Set
  • 鍵值對應、快速查找 -> Dictionary

掌握了這些工具,您就能根據需求選擇最合適的武器。下一章我們將探討 模組與套件 (Modules & Packages),學習如何組織您的程式碼檔案!


延伸閱讀

LATEST POST
TAG