Learning Objectives
- 字典(dict)的宣告與運算:以 key 對應 value,可以改變
- 新增、修改、查詢與刪除字典的項目,分辨 KeyError 與 get()
- 字典相關的函數與方法:keys、values、items、get、pop、update、clear
- 字典生成式(dict comprehension)
為什麼需要字典
串列用「位置」找資料:scores[1] 是第 1 個分數,但它是哪一科?要另外記。
字典(dict)改用有意義的名字找資料:scores['math'] 一看就知道是數學成績。
scores = {'eng': 70, 'math': 82, 'comp': 63}
# key value
- 用大括號
{}括起來,每個項目寫成key: value,項目之間用逗號隔開;{}是空字典。 - key 必須唯一,value 可以重複。
- value 可以是任何型態;key 必須是不可變的型態,例如字串、數字、元組(串列不能當 key)。
- 字典可以改變(mutable):隨時新增、修改、刪除項目。
建立、查詢、更新與新增
看右邊的字典物件:每一列是一組 key 與 value。第 7 行和第 8 行寫法一模一樣,差別只在 key 是否已經存在:存在就更新,不存在就新增。
KeyError 與 get()
用 stock[key] 查不存在的 key 會引發 KeyError;get() 則會回傳 None 或你指定的預設值,不會出錯。setdefault() 很像 get(),但找不到時會順便把預設值新增進字典。
想一想:查詢與更新
下面的程式會印出什麼?
d = {'a': 1, 'b': 2}
d['a'] = 10
d['c'] = 3
print(len(d), d['a'])
下面的程式會印出什麼?
stock = {'apple': 3}
print(stock.get('kiwi', 0) + stock.get('apple', 0))
下面哪一個不能當作字典的 key?
值是串列,以及刪除、取出、合併
字典的 value 可以是串列:dt['java'][1] 先用 key 拿到串列,再用索引拿到串列的元素。接著比較四種「拿掉」的方式:del、pop()、update() 合併、clear() 清空。
字典相關的函數與方法
| 函數/方法 | 作用 |
|---|---|
len(d) |
項目個數 |
sorted(d) |
依 key 排序後的串列;reverse=True 由大到小 |
max(d)、min(d) |
最大、最小的 key |
d.get(key, default) |
取值;key 不存在時回傳 default(預設 None),不會引發 KeyError |
d.setdefault(key, default) |
類似 get;key 不存在時會新增 d[key] = default |
d.keys()、d.values()、d.items() |
所有 key、所有 value、所有 (key, value) 元組 |
d.update(other) |
把 other 字典合併進來 |
d.pop(key, default) |
刪除並傳回 key 的值;不存在時傳回 default |
d.popitem() |
刪除並傳回最後加入的 (key, value)(後進先出) |
d.copy() |
複製一份新的字典 |
d.clear() |
移除所有項目,字典本身還在 |
del d[key]/del d |
刪除一個項目/刪除整個字典這個名稱 |
走訪字典:keys、values、items
for k in scores 直接走訪字典時,拿到的是 key。要同時拿 key 和 value,用 items() 搭配上一課學過的元組解包。
用字典計數
這是字典最常見的用途之一:數每個字出現幾次。看右邊的 counts,第一次遇到某個字時新增一個項目,再遇到時次數加 1。第 14 行用 get(word, 0) 把兩種情況合成一行。
字典生成式
和串列生成式很像,只是外面換成大括號,前面寫成 key: value。後面可以加 if 篩選。
追蹤走訪與生成式
下面的程式會印出什麼?
d = {'x': 1, 'y': 2, 'z': 3}
total = 0
for k, v in d.items():
if k != 'y':
total += v
print(total)
下面的程式會印出什麼?
d = {x: x * 2 for x in range(1, 4)}
print(d)
實作:統計投票結果
votes 記錄了每一票投給哪種水果。請補完迴圈,用字典 counts 數出每種水果的票數,下面的程式會依序印出「水果 票數」。
重點精華回顧
- 字典(dict)用
{key: value}表示,可以改變;key 必須唯一且不可變,value 可以是任何型態。 d[key] = value:key 存在就更新,不存在就新增;key in d檢查的是 key。d[key]查不到會引發 KeyError;d.get(key, default)不會出錯,setdefault還會順便新增。- 刪除:
del d[key]、d.pop(key)(取回值)、d.clear()(清空);合併:d.update(other)。 - 走訪:
for k in d拿到 key;d.items()搭配解包同時拿 key 與 value。 - 計數的慣用寫法:
counts[w] = counts.get(w, 0) + 1。 - 字典生成式:
{k: v for 變數 in 可走訪物件 if 條件}。