字典簡介
你好!歡迎來到數據結構基礎中最實用的章節之一。到目前為止,你可能已經使用過陣列 (Arrays) 或 列表 (Lists),這些結構都是透過數字(索引)來尋找資料。但如果你想透過名稱或標籤來查找資料呢?這正是字典 (Dictionaries) 發揮作用的地方!
你可以把字典想像成手機裡超級強大的聯絡人清單。你不需要記住朋友是「第 42 號聯絡人」來找他;你只需要輸入他的名字。字典讓搜尋特定資訊變得既快速又直觀。讓我們深入了解吧!
1. 什麼是字典?
在電腦科學中,字典是一種抽象資料型態 (Abstract Data Type, ADT),它以鍵值對 (Key-Value Pairs) 的形式儲存資料。
字典中的每一項資料都包含兩個部分:
1. 鍵 (Key):這充當了唯一的識別碼(就像實體字典中的單字,或是通訊錄中某人的姓名)。
2. 值 (Value):這是與該鍵相關聯的實際資料(就像單字的定義,或是該人的電話號碼)。
鍵的黃金法則
在任何字典中,鍵 (Keys) 必須是唯一 (unique) 的。你不能擁有兩個相同的鍵,因為電腦將無法判斷該回傳哪一個值!不過,值 (Values) 則不需要唯一——兩個不同的鍵可以對應到同一個值。
快速複習:鍵 vs. 值
- 鍵 (Key):你用來查找資料的標籤(必須唯一)。
- 值 (Value):系統回傳給你的資料(可以是任何內容)。
重點總結
字典是一組鍵值對的集合,你可以透過相關聯的鍵來存取其對應的值。
2. 字典與陣列的比較
如果這聽起來有點抽象,別擔心!讓我們把它和你已經熟悉的陣列 (Array) 比較一下。
在陣列中,「鍵」永遠是整數索引 (integer index)(0, 1, 2...)。是由電腦決定位置。
在字典中,「鍵」幾乎可以是任何資料型態,例如字串 (string)。由你(程式設計師)決定標籤的內容。
陣列: Names[0] = "Alice"
字典: Ages["Alice"] = 17
你知道嗎?
在搜尋特定項目時,字典通常比陣列快得多。在一個龐大的陣列中,你可能需要檢查每一個格子才能找到「Alice」。而在字典中,你只需直接要求查找「Alice」,電腦就能精確地知道該值儲存在哪裡!
3. 現實應用
AQA 課程大綱特別提到資訊檢索 (Information Retrieval) 是字典的核心用途。一個經典的例子是統計文件中單字出現的次數。
步驟拆解:單字頻率統計
想像我們有這樣一個句子:"The green, green grass grows"。我們想要儲存每個單字出現的次數。我們可以將其表示為一個字典:
1. "The":出現 1 次。
2. "green":出現 2 次。
3. "grass":出現 1 次。
4. "grows":出現 1 次。
以程式語言的符號表示如下:
{ 'the': 1, 'green': 2, 'grass': 1, 'grows': 1 }
重點總結
字典非常適合快速檢索資訊,例如查詢定義、識別碼 (ID) 或統計頻率。
4. 以字典表示向量
在課程稍後,你會接觸到向量 (Vectors)。課程大綱指出,當我們將向量視為一個函數 (function) 時,字典是用來表示向量的一種非常有用的方式。
對於像 \( [2.0, 3.14, -1.0] \) 這樣的向量,我們可以將其視為一種映射,其中索引對應到一個值:
\( 0 \mapsto 2.0 \)
\( 1 \mapsto 3.14 \)
\( 2 \mapsto -1.0 \)
在字典中,這會是:{0: 2.0, 1: 3.14, 2: -1.0}。這對於「稀疏向量 (sparse vectors)」特別有效,因為大部分數值為零時,我們只需要儲存那些確實有資料的鍵即可!
5. 常見操作
當你在程式專案中使用字典時,通常會執行以下四項任務:
- 新增 (Add) 一組新的鍵值對。
- 刪除 (Delete) 現有的鍵值對。
- 修改 (Amend/Update) 現有鍵對應的值。
- 查詢 (Lookup) 鍵所對應的值。
避免常見錯誤:
嘗試存取不存在的鍵!如果你要求字典回傳 "Bob" 的值,但字典裡並沒有 "Bob",你的程式很可能會因為「鍵錯誤 (Key Error)」而崩潰。務必先檢查該鍵是否存在!
記憶小幫手:鑰匙圈
想像一個實體的鑰匙圈。每一把鑰匙 (Key) 都有獨特的形狀。當你使用那把鑰匙時,它能打開一扇特定的門 (Value)。你可以把很多鑰匙掛在圈上,但每一把都是獨一無二的!
快速複習總結
它是什麼? 一組鍵值對的集合。
有順序嗎? 從概念上講,字典是無序的。我們關注的是關聯性 (association),而不是序列。
鍵的規則: 鍵必須唯一;值不需要唯一。
主要用途: 快速資訊檢索及表示複雜的映射關係(如向量)。
最後的鼓勵
如果你習慣了陣列那種嚴格的「0, 1, 2」索引,字典一開始可能讓你覺得有點陌生,但一旦你開始使用它,你會發現它讓你的程式碼更易讀、執行效率更高。在接下來的程式練習中多嘗試使用它吧!