Home
Explore Uedu
Student Console
Register as Member/Login
Research Informed Consent Center
Survey Center
Educational Big Data Challenge
Claim or create a course
Try a Scenario Task
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

4

Local AI

--

Uedu Code

--

Taipei AQI 46 · Taichung AQI 76 · Tainan AQI 67 · Kaohsiung AQI 64
AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

Unit 11

字典(Dict)

key:value 的對照表:新增、查詢、走訪與計數
Interaction實作 25 minute(s)

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 是否已經存在:存在就更新,不存在就新增。

字典為什麼查得快

輸入或點選一個 key,看字典怎麼從 key 算出位置、直接到那一格拿資料。試試 mango:字典裡沒有這個 key,用中括號查就會引發 KeyError。(這是示意,Python 實際的雜湊計算方式更複雜。)

KeyError 與 get()

用 stock[key] 查不存在的 key 會引發 KeyError;get() 則會回傳 None 或你指定的預設值,不會出錯。setdefault() 很像 get(),但找不到時會順便把預設值新增進字典。

想一想:查詢與更新

1.

下面的程式會印出什麼?

d = {'a': 1, 'b': 2}
d['a'] = 10
d['c'] = 3
print(len(d), d['a'])
2.

下面的程式會印出什麼?

stock = {'apple': 3}
print(stock.get('kiwi', 0) + stock.get('apple', 0))
3.

下面哪一個不能當作字典的 key?

第 1 次作答

值是串列,以及刪除、取出、合併

字典的 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 篩選。

追蹤走訪與生成式

1.

下面的程式會印出什麼?

d = {'x': 1, 'y': 2, 'z': 3}
total = 0
for k, v in d.items():
    if k != 'y':
        total += v
print(total)
2.

下面的程式會印出什麼?

d = {x: x * 2 for x in range(1, 4)}
print(d)
第 1 次作答

實作:統計投票結果

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 條件}。
這一課完成了!
Next lesson:集合(Set)
你目前沒有登入,學習進度只存在這個瀏覽器。 Login 後,進度會跟著帳號,換電腦也看得到。