5.1. 字典
除了串列之外,在Python中另一個常被使用的資料結果是字典,在字典中儲存「鍵-值」對 (i.e., key-value pair),即一筆資料包含一組「鍵」及其對應的「值」,其中鍵在字典中是唯一的,但是不同的鍵可以有相同的值。此外,在字典中任兩個「鍵-值」對也不能相同。當建立一個空的字典之後,可以對其做加入、刪除或修改資料等對資料結構的操作。
建立字典
字典可以透過下列幾個方式建立。
>>> d = dict()
>>> d
{}
>>> type(d)
<class 'dict'>
>>> d = {}
>>> d
{}
>>> d = {1: 2, 3.0: 4.0, '5': '6'}
>>> d
{1: 2, 3.0: 4.0, '5': '6'}
在字典中的每個鍵是唯一的,不同的鍵可以有相同的值。
>>> d = {1: 2, 3: 4, 1: 5, 6: 4}
>>> d
{1: 5, 3: 4, 6: 4}
使用 len() 取得字典長度
使用 len() 可以得知字典中有幾個「鍵-值」對。
>>> d = {1: 2, 3.0: 4.0, '5': '6'}
>>> len(d)
3
加入「鍵-值」對
使用「[ ]」及 = 指派運算子加入「鍵-值」對到字典中。
>>> d = {1: 2, 3.0: 4.0, '5': '6'}
>>> d[7] = 8.0
>>> d
{1: 2, 3.0: 4.0, '5': '6', 7: 8.0}
使用 in 判斷 key 是否在字典中
想知道某個鍵是否在字典中時,可以使用 in 關鍵字來判斷。
>>> d = {1: 2, 3.0: 4.0, '5': '6'}
>>> 1 in d
True
>>> 3.0 in d.keys()
True
>> '7' in d
False
使用 setdefault()時,若某個鍵不在字典中,又想要給它一個預設值時。反之,回傳該鍵的值。
>>> d = {1: 2, 3.0: 4.0, '5': '6'}
>>> d.setdefault(7, 0)
0
>>> d.setdefault(1, 0)
2
使用 key 「存取」資料
要存取字典中的資料時,可以使用鍵或 get() 來取得某個鍵所對應到的值。
>>> d = {1: 2, 3.0: 4.0, '5': '6'}
>>> d[1]
2
>>> d[3.0]
4.0
>>> d.get('5')
'6'
>>> d[1] = '7'
>>> d
{1: '7', 3.0: 4.0, '5': '6'}
字典中也可以包含其他類型的資料結構。
>>> d = {'list': [1, 2, 3], 'tuple': (5, 6, 7), 'dict': {8: 9, '10': 11}}
>>> d
{'list': [1, 2, 3], 'tuple': (5, 6, 7), 'dict': {8: 9, '10': 11}}
>>> d['list'][0] = 4
>>> d['list']
[4, 2, 3]
>>> d['tuple'] = (5, 6, 7, 8)
>>> d['tuple']
(5, 6, 7, 8)
>>> d['dict'][8] = 12
>>> d['dict']
{8: 12, '10': 11}
使用 keys() 取得所有的「鍵」
使用 keys() 可以取得字典中所有的鍵。
>>> d = {1: 2, 3.0: 4.0, '5': '6'}
>>> d.keys()
dict_keys([1, 3.0, '5'])
>>> type(d.keys())
<class 'dict_keys'>
>>> k = list(d.keys())
>>> k
[1, 3.0, '5']
使用 values() 取得所有的「值」
使用 keys() 可以取得字典中所有的鍵。
>>> d = {1: 2, 3.0: 4.0, '5': '6'}
>>> d.values()
dict_values([2, 4.0, '6'])
>>> type(d.values())
<class 'dict_values'>
>>> v = list(d.values())
>>> v
[2, 4.0, '6']
使用 items() 取得所有的「鍵-值」對
使用 items() 可以得知道字典中所有的「鍵-值」對,當使用 list() 對 items() 的結果做轉換時,會得到元組的串列(i.e, list of tuple)。
>>> d = {1: 2, 3.0: 4.0, '5': '6'}
>>> d.items()
dict_items([(1, 2), (3.0, 4.0), ('5', '6')]
>>> type(d.items())
<class 'dict_items'>
>>> l = list(d.items())
>>> l
[(1, 2), (3.0, 4.0), ('5', '6')]
此外,利用迴圈及多重指派等方式來讀取字典中所有的資料。
d = {1: 2, 3.0: 4.0, '5': '6'}
for a, b in d.items():
print(a, b)
# 執行結果
1 2
3.0 4.0
5 6
使用 del 關鍵字刪除資料
如果要刪除字典中的資料時,可以使用 del 關鍵字及鍵。
>>> d = {1: 2, 3.0: 4.0, '5': '6'}
>>> del d[1]
>>> d
{3.0: 4.0, '5': '6'}
>>> del d[3.0]
>>> d
{'5': '6'}
>>> del d['5']
>>> d
{}
使用 clear() 可以刪除字典中所有的資料,或是使用 = 指派運算子及指派空字典 {} 來達成。
>>> d = {1: 2, 3.0: 4.0, '5': '6'}
>>> d.clear()
>>> d
{}
>>> d = {1: 2, 3.0: 4.0, '5': '6'}
>>> d = {}
>>> d
{}
使用 update() 合併字典
當需要合併2個相關資料的字典時,可以使用 update() 來達成。如果要合併的字典中有重複的鍵時,則該「鍵-值」對會覆蓋掉原有的「鍵-值」對。
>>> d1 = {1: 2, 3: 4}
>>> d2 = {'5': '6', 7: 8.0}
>>> d1.update(d2)
>>> d1
{1: 2, 3: 4, '5': '6', 7: 8.0}
>>> d3 = {1: 9, 3: 10.0}
>>> d1.update(d3)
>>> d1
{1: 9, 3: 10.0, '5': '6', 7: 8.0}
牛刀小試
- b515: 摩斯電碼-商競103 [參考答案] ★★, practice
- 使用 for 迴圈、字典
- 程式設計步驟:
# 步驟1: 處理資料輸入
n = input("")
n = n.strip(" \t\r\n")
# 步驟2: 資料類型轉換
n = int(n)
# 步驟3: 建立摩斯碼(key)及字母(value)的字典
code = {".-": "A",
"-...": "B",
"-.-.": "C",
"-..": "D",
".": "E",
"..-.": "F",
"--.": "G",
"....": "H",
"..": "I",
".---": "J",
"-.-": "K",
".-..": "L",
"--": "M",
"-.": "N",
"---": "O",
".--.": "P",
"--.-": "Q",
".-.": "R",
"...": "S",
"-": "T",
"..-": "U",
"...-": "V",
".--": "W",
"-..-": "X",
"-.--": "Y",
"--..": "Z"
}
# 步驟4: 使用 for 迴圈
for i in range(0, n):
# 步驟5: 處理資料輸入
s = input("")
s = s.strip(" \t\r\n")
# 步驟6: 分割資料
s = s.split()
# 步驟7: 使用 for 迴圈對每一個摩斯碼轉換成字母及輸出結果
for i in range(0, len(s)):
s[i] = code[s[i]]
print("".join(s))
躍躍欲試
- 迴圈 + 字典 + If-Else:
- a020: 身分證檢驗 [參考答案] ★
- a058: MOD3 [參考答案]
- b374: [福州19中]眾數 [參考答案] ★
- b512: 高維度稀疏向量 [參考答案] ★★★
- d566: 秒殺率 [參考答案] ★★
- d710: parking lot [參考答案] ★★★
參考資料
- Python自動化的樂趣, 第五章, Al Sweigart 著、H&C 譯, 碁峰
- Python編程入門第3版(簡), 第七章, Toby Donaldson著, 人民郵電出版社
- 精通Python, 第三章, Bill Lubanovic著, 賴屹民譯, 歐萊禮