Skip to content

Python dict 超級簡單筆記


1. dict 是什麼?

dict 是 Python 的「字典」。

它用來存:

key -> value

也就是:

名稱 -> 對應資料

例如:

score = {
    "Tom": 90,
    "Amy": 85,
    "Bob": 70
}

意思是:

Tom 的分數是 90
Amy 的分數是 85
Bob 的分數是 70

可以把它想成 C++ 的:

map<string, int>

2. 建立 dict

建立空字典:

d = {}

建立有資料的字典:

d = {
    "A": 3,
    "B": 5,
    "C": 1
}

3. 讀取 value

d = {
    "A": 3,
    "B": 5
}

print(d["A"])

輸出:

3

因為 "A" 對應到 3


4. 新增資料

d = {}

d["A"] = 1
d["B"] = 2

print(d)

輸出:

{'A': 1, 'B': 2}

意思是:

A -> 1
B -> 2

5. 修改資料

d = {
    "A": 1
}

d["A"] = 5

print(d["A"])

輸出:

5

如果 key 已經存在,重新指定就會修改 value。


6. 計數常用寫法

假設我們要統計字母出現幾次。

s = "ABCA"
cnt = {}

for ch in s:
    cnt[ch] = cnt.get(ch, 0) + 1

print(cnt)

輸出:

{'A': 2, 'B': 1, 'C': 1}

這是競程很常用的寫法。


7. get 是什麼?

cnt.get(ch, 0)

意思是:

如果 cnt 裡面有 ch,就回傳 cnt[ch]
如果 cnt 裡面沒有 ch,就回傳 0

例如:

cnt = {
    "A": 2
}

print(cnt.get("A", 0))
print(cnt.get("B", 0))

輸出:

2
0

因為 "A" 存在,所以回傳 2

因為 "B" 不存在,所以回傳預設值 0


8. 為什麼計數要用 get?

如果直接寫:

cnt = {}
cnt["A"] += 1

會錯。

因為一開始 cnt["A"] 不存在。

正確寫法:

cnt = {}

cnt["A"] = cnt.get("A", 0) + 1

意思是:

A 原本不存在,所以當作 0
0 + 1 = 1
cnt["A"] = 1

9. 判斷 key 存不存在

d = {
    "A": 3,
    "B": 5
}

if "A" in d:
    print("A exists")

輸出:

A exists

也可以判斷不存在:

if "C" not in d:
    print("C does not exist")

10. 刪除資料

d = {
    "A": 3,
    "B": 5
}

del d["A"]

print(d)

輸出:

{'B': 5}

11. 走訪 dict 的 key

d = {
    "A": 3,
    "B": 5
}

for key in d:
    print(key)

輸出:

A
B

直接 for key in d,會拿到每個 key。


12. 走訪 key 和 value

d = {
    "A": 3,
    "B": 5
}

for key, value in d.items():
    print(key, value)

輸出:

A 3
B 5

items() 會把 dict 裡面的資料變成一組一組:

("A", 3)
("B", 5)

13. 只拿 key

d.keys()

例如:

d = {
    "A": 3,
    "B": 5
}

print(d.keys())

可以看成拿到:

A, B

14. 只拿 value

d.values()

例如:

d = {
    "A": 3,
    "B": 5
}

print(d.values())

可以看成拿到:

3, 5

15. dict 排序

dict 本身通常不是直接排序,而是拿出 items() 來排序。

例如:

cnt = {
    "A": 2,
    "B": 5,
    "C": 1
}

ans = sorted(cnt.items())

print(ans)

輸出:

[('A', 2), ('B', 5), ('C', 1)]

這是按照 key,也就是字母排序。


16. 按照 value 排序

cnt = {
    "A": 2,
    "B": 5,
    "C": 1
}

ans = sorted(cnt.items(), key=lambda x: x[1])

print(ans)

輸出:

[('C', 1), ('A', 2), ('B', 5)]

因為:

x = ("A", 2)
x[0]  "A"
x[1]  2

所以:

key=lambda x: x[1]

代表按照次數排序。


17. 按照 value 由大到小排序

cnt = {
    "A": 2,
    "B": 5,
    "C": 1
}

ans = sorted(cnt.items(), key=lambda x: -x[1])

print(ans)

輸出:

[('B', 5), ('A', 2), ('C', 1)]

因為 Python 預設是小到大,所以加負號 -x[1] 可以變成大到小。


18. UVA 10008 常用排序

題目要:

次數由大到小
次數相同時,字母由小到大

可以寫:

ans = sorted(cnt.items(), key=lambda x: (-x[1], x[0]))

意思是:

先看 -次數
再看 字母

19. 完整計數範例

s = "Hello World"

cnt = {}

for ch in s.upper():
    if "A" <= ch <= "Z":
        cnt[ch] = cnt.get(ch, 0) + 1

ans = sorted(cnt.items(), key=lambda x: (-x[1], x[0]))

for ch, num in ans:
    print(ch, num)

輸出大概會是:

L 3
O 2
D 1
E 1
H 1
R 1
W 1

20. 最重要的三行

如果你現在只想先背最常用的 dict 寫法,背這三個就好:

cnt = {}

建立空字典。

cnt[ch] = cnt.get(ch, 0) + 1

統計 ch 出現次數。

for key, value in cnt.items():
    print(key, value)

走訪所有 key 和 value。


21. dict 和 list 的差別

list 用數字位置找資料:

a = [10, 20, 30]

print(a[0])

輸出:

10

dict 用 key 找資料:

d = {
    "Tom": 90,
    "Amy": 85
}

print(d["Tom"])

輸出:

90

可以這樣記:

list:用 index 找資料
dict:用 key 找資料

22. 競程常用情境

dict 很常用在:

統計出現次數
記錄某個東西是否出現過
把名字對應到分數
把字串對應到編號
記錄座標、狀態、資料表

例如:

id_map = {}

id_map["Alice"] = 1
id_map["Bob"] = 2

print(id_map["Alice"])

輸出:

1

23. 最簡單心法

dict 就是:

key 對應 value

例如:

字母 -> 次數
名字 -> 分數
城市 -> 人口
字串 -> 編號

在 Python 裡寫成:

d[key] = value

讀取時寫成:

d[key]