![](../../img/interpret.jpg)
Python 簡易手冊
單元 41 - 字典
字典 (dictionary) 是配對型的資料型態 (literal) ,字面常數 (literal) 為大括弧,元素 (element) 是以冒號區隔,冒號前方為 key ,後方為 value ,每組 key:value 再以逗號區隔,舉例如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # 建立字典 a = {"a": 1, "b": [1, 2]} # 加入字典元素 a["c"] = "12" # 刪除字典元素 del a["a"] # 印出字典 print(a) print("b" in a) print("d" not in a) # 檔名: dictionary_demo.py # 說明: 《Python簡易手冊》的範例 # 網址: http://kaiching.org # 作者: Kaiching Chang # 時間: 2024 年 3 月 |
第 2 行建立字典變數 (variable) a ,裡面有兩個元素,字典的 key 必須是不可變的資料型態,例如字串 (string) 、數字等等, vlaue 則沒有限制
1 2 | # 建立字典 a = {"a": 1, "b": [1, 2]} |
第 5 行是用新增 key 的方式加入新的元素
5 6 | # 加入字典元素 a["c"] = "12" |
第 7 行用關鍵字 (keyword) del 刪除 key 為 "a" 的元素
6 7 | # 刪除字典元素 del a["a"] |
單元 32 - del 陳述介紹關鍵字 del 的用法。
下面印出部分包含用 in 判斷某個 key 是否在及不在字典 a 中,此例執行結果如下
> python dictionary_demo.py |
{'b': [1, 2], 'c': '12'} True True |
> |
單元 19 - in 運算子介紹關鍵字 in 的用法。
字典也可以用內建函數 (built-in function) dict() 建立,例如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # 以不限個數引數建立字典 a = dict(a=1, b=2) print(a) # 印出變數 a 讀元素個數 print(len(a)) # 以串列建立字典 b = dict([('a', 1), ('b', 2)]) print(b) # 以 zip() 建立字典 c = dict(zip(['a', 'b'], [1, 2])) print(c) # 檔名: dictionary_demo2.py # 說明: 《Python簡易手冊》的範例 # 網址: http://kaiching.org # 作者: Kaiching Chang # 時間: 2024 年 3 月 |
第 2 行是用不限個數引數建立字典,簡單說,引數識別字會被當成 key ,引數值則是 value
1 2 3 4 5 | # 以不限個數引數建立字典 a = dict(a=1, b=2) print(a) # 印出變數 a 讀元素個數 print(len(a)) |
單元 47 - 不限個數引數會介紹不限個數引數的定義方式。
第 10 行是用兩組序對的串列建立字典,每組序對都有兩個元素,第一個元素是 key ,第二個元素 value
7 8 9 | # 以串列建立字典 b = dict([('a', 1), ('b', 2)]) print(b) |
單元 39 - 串列介紹如何定義串列,單元 38 - 序對與 Range介紹如何定義序對。
第 12 行是以內建函數 zip() 建立字典, zip() 會拆解引數為 key 及 value
11 12 13 | # 以 zip() 建立字典 c = dict(zip(['a', 'b'], [1, 2])) print(c) |
此例執行結果如下
> python dictionary_demo2.py |
{'a': 1, 'b': 2} 2 {'a': 1, 'b': 2} {'a': 1, 'b': 2} |
> |
以上示範一些字典型態的操作及建立字典,下表整理字典的操作方式,其中 d 及 other 都是字典
操作 | 說明 |
---|---|
list(d) | 回傳 d 中所有 key 的串列 |
len(d) | 回傳 d 中的元素數量 |
iter(d) | 回傳 d 中 key 的迭代器 |
reversed(d) | 回傳倒轉 key 順序的迭代器 |
d[key] | 回傳 d 中 key 的 value |
d[key] = value | 替 d 新增元素 key:value |
del d[key] | 刪除 d 中 key:value |
key in d | 判斷 key 是否存在於 d 中 |
key not in d | 判斷 key 是否不存在於 d 中 |
d | other | 回傳一個新字典,其為合併 d 及 other 的元素,如果 key 相同,則會採用 other 的 value |
d |= other | 同上,將新字典直接重新指派給 d |
字典物件有以下方法
方法 | 說明 |
---|---|
d.clear() | 清除所有元素 |
d.copy() | 回傳字典的淺層拷貝 |
d.get(key, default=None) | 回傳該 key 的 value |
d.items() | 回傳字典元素的 view 物件 |
d.keys() | 回傳字典 key 的 view 物件 |
d.pop(key[, default]) | 移除並回傳指定 key 的 value |
d.popitem() | 移除並回傳一組 (key, value) |
d.setdefault(key, default=None) | 回傳指定 key 的 value 或不存在該 key 就設定該 key 為 default 的設定值 |
d.update([other]) | 將 other 元素新增至原字典,如果有相同的 key ,就設定為 other 的 value |
d.values() | 回傳字典 dictionary 的 view 物件 |
另外有以下的類別方法
類別方法 | 說明 |
---|---|
doct.fromkeys(iterable, value=None) | 建立新字典,由 iterable 設定新字典的 key , value 則為 value |
以下繼續示範簡單例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # 建立字典 a = {"a": 1, "b": [1, 2]} # 拷貝字典 b = a.copy() print(a is b) print(a["b"] is b["b"]) # 取得 key 為 "b" 的 value c = a.get("b") print(c) # 移除元素 d = a.popitem() print(d) # 取得所有 key e = a.keys() print(e) # 檔名: dictionary_demo3.py # 說明: 《Python簡易手冊》的範例 # 網址: http://kaiching.org # 作者: Kaiching Chang # 時間: 2024 年 3 月 |
第 5 行利用 copy() 方法進行拷貝,注意 copy() 只是做淺層拷貝,因此 a 與 b 不會是相同的物件,但是 a["b"] 與 b["b"] 會是相同的串列
4 5 6 7 | # 拷貝字典 b = a.copy() print(a is b) print(a["b"] is b["b"]) |
如果字典 vlaue 為可變資料型態要拷貝成新物件,那就要利用標準程式庫 (standard library) 中的 copy 做深層拷貝。
下面用 get() 取得 key 為 "b" 的元素,然後用 popitem() 移除元素,最後用 keys() 取得所有 key 的 view 物件,此例執行結果如下
> python dictionary_demo3.py |
False True [1, 2] ('b', [1, 2]) dict_keys(['a']) |
> |
參考資料
- https://docs.python.org/3/tutorial/datastructures.html#dictionaries
- https://docs.python.org/3/library/stdtypes.html#mapping-types-dict
![](../../img/pydoing.gif)