熟客說「老樣子」,這句話對一排位置毫無意義,對一個名字卻什麼都說得清。字典能讓「燕麥拿鐵」直接換出價格,不用數到第幾行。可名字不在選單上時,該發生什麼?
字典把鍵映射到值。當一條記錄包含有名字的欄位,例如飲品、價格和數量,就適合用字典。鍵必須唯一;給已有鍵重新賦值會覆蓋舊值。 你還會安全地計數,並逐層讀取巢狀記錄。
按鍵尋找
方括號可以按鍵讀取值。缺少鍵會觸發 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 執行時,可能需要幾秒鐘。
練習本課
12 道題,作答後立即看到解釋。