第 07 課 · 入門 · 19 分鐘

Python 字典

用有名字的鍵儲存值,通過名稱尋找,而不是通過位置。

鍵存取get 預設值items 與計數

熟客說「老樣子」,這句話對一排位置毫無意義,對一個名字卻什麼都說得清。字典能讓「燕麥拿鐵」直接換出價格,不用數到第幾行。可名字不在選單上時,該發生什麼?

字典把鍵映射到值。當一條記錄包含有名字的欄位,例如飲品、價格和數量,就適合用字典。鍵必須唯一;給已有鍵重新賦值會覆蓋舊值。 你還會安全地計數,並逐層讀取巢狀記錄。

按鍵尋找

方括號可以按鍵讀取值。缺少鍵會觸發 KeyError。get(key, default) 會回傳預設值而不是報錯,適合處理可選欄位和計數。

order = {"drink": "拿鐵", "price": 4.5}
print(order["drink"])
print(order.get("quantity", 1))
print(order.get("notes", "無"))

鍵存取與預設值

走訪鍵值對

keys()、values() 和 items() 提供不同的視圖。items() 會產生鍵值對,可以在 for 迴圈中解包。現代 Python 會保留插入順序。

order = {"drink": "拿鐵", "price": 4.5}
for key, value in order.items():
    print(key, value)

把記錄變成迴圈

用 get 計數

要統計出現次數,先用 get(name, 0) 讀取目前計數,加一,再賦回去。這個模式可以處理第一次出現的情況,不需要額外判斷。

orders = ["拿鐵", "茶", "拿鐵"]
counts = {}
for drink in orders:
    counts[drink] = counts.get(drink, 0) + 1
print(counts)

統計重複值

計數時不觸發 KeyError

某個鍵第一次出現時,counts[key] += 1 會失敗;dict.get(key, 0) 提供預設值,又不會修改字典。標準函式庫的 collections.Counter 更省事,但手寫一次迴圈能把計數規則看清楚。

votes = ["tea", "latte", "tea", "mocha", "tea"]
counts = {}
for vote in votes:
    counts[vote] = counts.get(vote, 0) + 1
print(counts)
print(counts.get("water", 0))

預設值讓計數更安全

逐層讀取巢狀記錄

巢狀字典方便,也脆弱:每一層都可能缺失。一次讀一層,可選欄位用 .get(),索引前檢查型別。customer 缺失,和 customer 存在但沒有 name,是兩種不同情況。

order = {"id": 7, "customer": {"name": "Maya"}, "items": ["latte"]}
customer = order.get("customer", {})
print(customer.get("name", "unknown"))
print(order.get("note", "no note"))
items = order.get("items", [])
print(isinstance(items, list), len(items))

可選鍵與型別檢查

用 get() 計數

dict.get(key, default) 讀取不存在的鍵時不會拋 KeyError,因此很適合計數。counts[word] = counts.get(word, 0) + 1 是標準寫法。要排名時,按值降序、鍵升序排序;lambda 回傳一個元組,就能同時表達兩條規則。

words = ["tea", "latte", "tea", "mocha", "tea"]
counts = {}
for word in words:
    counts[word] = counts.get(word, 0) + 1
print(counts)
print(sorted(counts.items(), key=lambda pair: (-pair[1], pair[0])))

先計數,再排名

本課要點

  • 字典使用有名字的鍵,而不是數字位置。
  • 鍵不存在時,get 會回傳預設值。
  • items() 一次給出鍵和值。
  • 給已有鍵賦值會更新它的值。
  • dict.get() 可以給預設值;巢狀存取仍要逐層檢查。
  • get(key, 0) 讓計數不必先判斷鍵是否存在。

常見錯誤

  • 用方括號存取不存在的鍵,觸發 KeyError。
  • 忘記字典的鍵必須唯一。
  • 試圖直接排序字典,而不是排序它的 items。
  • 對可選資料直接用 d[key],缺少鍵時拋例外。
  • 鍵還不存在時就寫 counts[word] += 1。
輪到你

建立一個訂單字典,添加 quantity 欄位,並列印格式化後的總價。

動手試試

改改變數、先預測輸出,再執行程式碼。第一次點擊「執行程式碼」時會下載 Python 執行時,可能需要幾秒鐘。

瀏覽器內 Python本機執行 · 無需帳號
首次執行會從 CDN 下載 Pyodide。修改後點擊「執行程式碼」。

練習本課

12 道題,作答後立即看到解釋。

查看 12 道題答案開始練習
← 列表函式 →