
資料結構 (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) - 慢(因為需要移動後續所有元素)。
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?
- 安全性: 保證數據不會被意外修改(適合設定檔、常數)。
- 雜湊性 (Hashable): 因為不可變,所以可以作為 Dictionary 的 Key 或 Set 的元素(List 不行)。
- 效能: 建立與存取速度略快於 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:
- 資料不應被改變:如一周的七天、地理座標 (lat, long)。
- 作為 Dict Key:因為 List 不可雜湊,無法當 Key,但 Tuple 可以。
- 效能微優化:在創建大量小型陣列時,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),學習如何組織您的程式碼檔案!
延伸閱讀:
- Python 官方文件:Data Structures
- TimeComplexity - Python Wiki (了解各操作的時間複雜度)