這裡的範例是可在 Python 3 執行的獨立小程式;輸出框是預先核對的結果。題庫作答時,請保留題目提供的 solve 與參數,使用 return 交回答案。模組章的雙檔範例會另外標明操作方式。
01|從位置改成有名字的鍵
清單靠位置找元素,字典靠鍵 key 找值 value。字典使用大括號,每筆寫 key: value。鍵不能重複;同一個鍵再次指定時會更新原本的值。字典適合保存一個人的不同欄位,或建立名稱對照表。
learner = {"name": "小芽", "level": 2}
print(learner["name"])
learner["level"] = 3
learner["active"] = True
print(learner)小芽
{'name': '小芽', 'level': 3, 'active': True}02|查找前先考慮鍵不存在
record[key] 找不到鍵時會出現 KeyError。get(key, default) 可在缺少資料時回傳預設值;若沒指定 default,預設為 None。用 in 檢查字典時,檢查的是鍵,不是值。
stock = {"pencil": 5, "eraser": 0}
print(stock.get("pencil", 0))
print(stock.get("ruler", 0))
print("eraser" in stock)
print(5 in stock)5 0 True False
03|更新、合併與刪除
直接指定可以新增或更新單一鍵;update 可用另一份字典批次更新。pop(key, default) 移除指定鍵並回傳原值,沒找到時回傳 default;del record[key] 則要求鍵一定存在。
profile = {"name": "小芽", "level": 1, "draft": True}
profile.update({"level": 2, "points": 30})
removed = profile.pop("draft", False)
print(profile)
print(removed){'name': '小芽', 'level': 2, 'points': 30}
True04|用 items 同時走訪鍵與值
for key in record 會取得每個鍵;values() 取得值;items() 取得鍵與值。字典保留插入順序,但如果題目要求特定排列,應自己明確排序,不能把資料來的順序當成題目規則。
scores = {"小芽": 80, "小林": 75}
for name, score in scores.items():
print(name, score)
print(sum(scores.values()))小芽 80 小林 75 155
05|字典很適合計數
每遇到一個項目,就讀出目前次數再加 1。get(item, 0) 讓第一次看到的項目從 0 開始,不需要先知道會出現哪些項目。這是把 for、函式與字典組合起來的一個實用例子。
words = ["apple", "pear", "apple", "grape", "pear"]
counts = {}
for word in words:
counts[word] = counts.get(word, 0) + 1
print(counts){'apple': 2, 'pear': 2, 'grape': 1}06|多筆紀錄:清單裡放字典
每筆資料的欄位相同時,可以把字典放進清單。外層清單決定有幾筆,內層字典說明每筆各欄位的意思。先確認欄位齊全,再進行篩選或彙整。
records = [
{"name": "小芽", "score": 88},
{"name": "小林", "score": 55},
{"name": "小晴", "score": 72},
]
passed = []
for record in records:
if record["score"] >= 60:
passed.append(record["name"])
print(passed)['小芽', '小晴']
07|選擇合適的鍵與資料格式
初學先使用文字或整數當鍵,清單不能直接當字典鍵。本站的輸入輸出使用 JSON,JSON 物件的鍵是文字;若題目要求回傳字典,請依指定的文字鍵建立結果。None/True/False 是 Python 寫法,JSON 對應 null/true/false。
- {} 是空字典;{1, 2} 是另一種型態 set,不是沒有值的字典。
- 重複鍵不會保存多份紀錄;要保留同名的多筆資料,可讓該鍵對應到清單。
- 走訪字典時不要改變它的大小;需要刪除項目時,先收集要刪的鍵或建立新字典。
WHEN SOMETHING GOES WRONG
遇到錯誤,先檢查這裡
寫成 record[name],但 name 沒有定義
要找文字鍵 name 時,請寫 record["name"]。沒有引號的 name 會被當成變數。
以為 in 會搜尋所有值
in record 檢查鍵;要找值可檢查 record.values()。先分清楚你手上拿的是鍵還是值。
同一個鍵重複出現,資料被更新
字典每個鍵只有一個值。若題意要累計,請讀取舊值後更新;若要保留多筆,使用清單。
PAUSE AND TRY
先不要急著看別人的寫法
- 比較 stock.get("eraser", 0) 與 "eraser" in stock,兩者回答的問題有何不同?
- 把水果計數改成計算一段文字中各個字母的次數。
- 建立兩筆商品紀錄,每筆包含 name 與 price,找出價格低於 50 的名稱。
先用紙筆預測,再改動範例中的數字或文字。結果與預期不同時,找出最早開始不同的那一步。
把這幾件事帶走
- 字典用鍵找值,鍵不能重複。
- 缺少鍵時的預設值要符合題目規則。
- 清單負責多筆、字典負責欄位,兩者可以互相搭配。
FROM READING TO PRACTICE
用三道免費題,練習本章觀念
先做簡單題確認語法,再把幾個步驟組合起來。三題都來自本章主題的新版免費題庫,難度表示需要組合的基本概念。
延伸閱讀:Python 官方文件
以下是本章查證使用的官方資料。可以先完成入門練習,再回來查閱更完整的參數與說明。