Python 字典與集合

進階

字典用鍵查值(phonebook["小明"]),get() 安全讀值,in 檢查鍵是否存在;集合 set 自動去重。統計票數用 votes[name] = votes.get(name, 0) + 1。

適合:中三資訊及通訊科技 · 單元:程式設計進階 · 建議學習路徑第 1/13 課

學完呢課,你會識:
  • 字典以鍵值對儲存:用鍵查找值,不用記位置。
  • 新增與更新同一寫法:d[key] = value;鍵新則新增、鍵舊則更新。
  • get() 安全讀值:鍵不存在時返回預設值,不會 KeyError。
文體:編程教學課有聲朗讀

文體小知識:編程教學課每個概念都配一段可以親手試的代碼例子,照住輸入、改一改,最快學會。

資訊及通訊科技Information & Communication Technology

§課文原文 Passage

1字典(Dictionary)是 Python 用來把資料一對一對儲存的結構:每一對有一個鍵(Key)和一個值(Value),就像真正的字典用字查解釋、通訊錄用姓名查電話。寫法:phonebook = {"小明": "9123 4567", "Mary": "6234 7789"}。要查小明的電話,寫 phonebook["小明"] 就得 "9123 4567" — 完全不用記住他在清單的第幾個位置。

2字典的常用操作很直觀:phonebook["阿強"] = "9876 1234" 新增一位聯絡人;對同一個鍵再指派一次就會更新。用 in 可以檢查鍵是否存在:"小明" in phonebook 得 True。想安全讀值就用 phonebook.get("阿明", "沒有紀錄") — 鍵不存在時返回預設文字,程式不會因此出錯。

3走訪字典用 for name, phone in phonebook.items(): 可以一次過取出所有鍵值對。另一個好用結構是集合(Set):set(["小明", "阿強", "小明"]) 得 {"小明", "阿強"} — 自動去掉重複元素,而且沒有次序。要數班中有多少個不同姓名,交給 set 一步就知。

4實際應用:班長選舉點票,用字典做計數器 — votes[name] = votes.get(name, 0) + 1,每唱一票加一,最後哪個鍵的值最大就當選。通訊錄、存貨數量、文章字詞統計都是同一套路:鍵做名字,值做數量。學懂字典與集合,處理成批資料快要人一步。

1重點摘要 Summary

字典用鍵查值(phonebook["小明"]),get() 安全讀值,in 檢查鍵是否存在;集合 set 自動去重。統計票數用 votes[name] = votes.get(name, 0) + 1。

2生字卡 Vocabulary

D
Dictionary字典

以鍵值對儲存資料的結構,用鍵直接查找值,例如通訊錄。

K
Key鍵

字典中用來查找的名稱,例如 {"小明": "9123 4567"} 裡的「小明」。

V
Value值

鍵所對應的資料,例如 {"小明": "9123 4567"} 裡的電話號碼。

K
Key-value pair鍵值對

字典中一個鍵配一個值的基本單位,用冒號連接。

g
get()安全取值方法

按鍵取值,鍵不存在時返回預設值而不報錯,例如 d.get("x", 0)。

i
items()鍵值對走訪

傳回所有鍵值對,配合 for 一次過取出鍵和值。

i
in (membership test)成員檢查

檢查某鍵是否存在於字典或某元素是否存在於集合,結果為 True 或 False。

S
Set集合

無次序、不重複的元素組合,常用來去重,例如 set([1, 1, 2]) 得 {1, 2}。

D
Deduplication去重

把重複的元素只保留一份的處理,是集合的典型用途。

3逐步講解 Steps

  1. 建立字典與讀值字典(Dictionary)以「鍵—值」成對儲存資料:student = {"name": "小明", "class": "3A"}。讀值時方括號內寫鍵:student["name"] 得 "小明",student["class"] 得 "3A"。與清單不同,字典用鍵而非編號存取,因此不必記住資料排第幾位,如同通訊錄用姓名查電話,而非用「第幾個聯絡人」查電話。鍵通常是字串且不可重複,值則可以是任何類型,這種彈性令字典成為最常用的資料結構之一。
  2. 新增與更新同一句寫法,鍵新就新增、鍵舊就更新:student["age"] = 14 新增一對鍵值;student["class"] = "3B" 把原本的 "3A" 更新為 "3B"。這種一致性令字典操作極為簡單:不必區分「加入」與「修改」兩種語法。留意更新是直接覆蓋舊值,舊值不會保留;若想保留歷史紀錄,應把值設為清單再用 append 加入。字典會記住新增的次序,列印時按此顯示,方便閱讀。
  3. 用 get() 安全讀值直接以 student["phone"] 讀取不存在的鍵,程式會報 KeyError 而中斷;get() 則安全:student.get("phone", "沒有填寫") 在鍵不存在時傳回預設文字「沒有填寫」,程式繼續運行。第二個參數可以省略,此時傳回 None。處理用戶輸入與外部資料時,鍵未必齊備,get() 是防錯必備工具;例如統計計數常用 votes.get(name, 0),首次遇見某名字時當作 0 看待,然後再加一。
  4. 走訪字典與 in 檢查走訪整個字典用 items():for name, phone in phonebook.items(): print(name, phone) 逐行印出「小明 9123 4567」等配對,items() 同時交出鍵與值。檢查鍵是否存在用 in:"小明" in phonebook 傳回 True,"阿明" in phonebook 傳回 False;配合 if 使用:if "阿明" in phonebook: print("找到了")。兩者組合可以寫出穩健的查詢程式:先用 in 檢查,存在才讀值,KeyError 永遠不會發生。
  5. 集合自動去重集合(Set)自動剔除重複元素:set(["小明", "阿強", "小明", "小美"]) 得 {"小明", "阿強", "小美"},只餘三個不同姓名。配合 len() 即得人數:len(set(names)) 就是不重複姓名的數目。集合沒有次序,不能像清單那樣用 scores[0] 讀取;它是「只要唯一、不要次序」場合的工具,例如統計班中有多少個不同國籍、問卷出現過哪些不同答案,一步便能完成。
  6. 字典做計數器字典最經典的應用是計數器。票據清單 votes = ["小明", "小美", "小明"],反覆執行 votes[name] = votes.get(name, 0) + 1:首次遇見「小明」時 get 傳回 0,加 1 後變成 1;第二次遇見時由 1 加至 2。全部處理之後 votes = {"小明": 2, "小美": 1}。這個「查舊值、加一、存回」的句式是編程通用套路,文章字詞統計、存貨點算、網站流量統計,靠的都是同一招。
  7. 綜合應用:唱票程式把上述技巧組合成選班長唱票程式:先建空計數器 count = {};for name in votes: 逐票處理,每票執行 count[name] = count.get(name, 0) + 1;完成後用 max(count, key=count.get) 找出值最大的鍵,即當選人。整個程式五六行,卻完成真實選舉的點票工作。同一套路更換資料即可用於:最受歡迎圖書借閱統計、食堂最受歡迎菜式調查。字典計數器是資料處理的第一把萬用鑰匙。

4圖解 Diagrams

Python 字典:鍵值配對 Dict & setstudent = {"name": "小明", "class": "3A"}student["name"] → "小明"# 鍵 key 揾值 value,好似查字典對比清單:list 用數字位(0,1,2)搵;dict 用名字(鍵)搵——更快更直觀集合 set:{1, 2, 3}——自動剔重複、冇次序,好用嚟「去除重複項」應用:通訊錄(名字→電話)、貨存(貨品→數量)、成績表揀容器:單排數 → list;要「名字搵嘢」→ dict;要剔除重複 → set
圖 1:Python 字典與集合

5例題示範 Example

例題:班長選舉唱票結果為 ["小明", "小美", "小明", "阿強", "小明"],用字典統計票數並找出當選人。

  1. 建立空計數器:count = {}。
  2. 逐票走訪:for name in votes:,每輪取出一個名字。
  3. 每票加一:count[name] = count.get(name, 0) + 1,首次遇見的名字由 0 起算。
  4. 唱票完成後 count = {"小明": 3, "小美": 1, "阿強": 1};用 max(count, key=count.get) 取值最大的鍵。
  5. 結果:小明得 3 票當選;可用 sum(count.values()) = 5 核對總票數無誤。
  6. 答案:票數統計為小明 3 票、小美 1 票、阿強 1 票,小明以 3 票當選。核心句式是 count[name] = count.get(name, 0) + 1,配合 max(count, key=count.get) 找出最高票者。

6常見錯誤 Mistakes

✗ 「字典同清單一樣,可以用 student[0] 讀第一項。」
✓ 字典用鍵查找,不用編號 — student[0] 只在鍵恰好是 0 時才有效,一般會出 KeyError。
✗ 「直接讀不存在的鍵最多得 None。」
✓ student["phone"] 遇上不存在的鍵會出 KeyError 終止程式;想安全就要用 get()。
✗ 「集合可以照 set[0] 這樣取出第一個。」
✓ 集合無次序,不支援索引;要逐個處理就用 for item in my_set。
✗ 「set(["小明", "小明"]) 會保留兩個小明。」
✓ 集合的本領正是去重 — 結果只有 {"小明"} 一個元素;想保留重複就應該用清單。
✗ 「字典會自動按字母排好次序。」
✓ 字典按插入次序保存鍵值對,不會自動排序;需要排序時要自己用 sorted() 處理。

75 題快測 Quick check

Q1phonebook = {"小明": "9123 4567", "Mary": "6234 7789"},phonebook["Mary"] 的結果是什麼?

Q2set([3, 1, 3, 2, 1]) 的結果是什麼?

Q3想讀一個可能不存在的鍵,最穩妥的寫法是?A. d["key"] B. d.get("key", 0) C. d.append("key")

Q4"小明" in phonebook 這句用來做什麼?

Q5votes = [];逐個執行 votes[name] = votes.get(name, 0) + 1 三次,name 依次為 "小明"、"小美"、"小明"。最後 votes 是什麼?

8重點回顧 Recap

  • 字典以鍵值對儲存:用鍵查找值,不用記位置。
  • 新增與更新同一寫法:d[key] = value;鍵新則新增、鍵舊則更新。
  • get() 安全讀值:鍵不存在時返回預設值,不會 KeyError。
  • in 檢查鍵是否存在;items() 讓 for 同時取出鍵和值。
  • 集合 set 無次序而且自動去重;統計票數、字詞就用字典計數器套路。

同級其他科

同一科其他級別