何謂字典
字典(dict)的每個元素是用冒號「:」分隔,冒號之前是鍵(Key),冒號之後是值(Value),換言之是由「鍵:值」組成一個元素。元素間用逗號「,」分隔,所有元素被「{}」大括號包圍,即完成字典型別。字典顧名思義,就像我們使用的字典,可以根據英文單字查詢到中文解釋,例如book 對應到 「書本」,如果用字典語法可以寫成 {'book':'書本'}。真實的字典是依規則排序以方便查詢,但是Python 中字典的元素並非依鍵值排序,而是依插入順序儲存的,其語法如下:
字典 = {鍵1:值1, 鍵2:值2, …}- 鍵必須是唯一而且不可變的,而鍵可以使用的型別為數值、字串或元組。
- 值可以是任何資料型別,除了常用型別外,串列、元組、字典…等也可以。
字典基本操作
字典在程式中可以進行元素的新增、修改及刪除等操作,語法如下:
| 功能 | 語法說明 |
|---|---|
| 修改 | 語法:字典[鍵] = 新值 |
| 刪除 | 語法:del 字典[鍵] #刪除字典中某一元素語法: del 字典 #刪除整個字典 |
| 新增 | 語法:字典[新鍵] = 值 |
[例] 字典基本操作。 (dict_1.py)
程式碼: dict_1.py
dict1 = {'一月':'正月','二月':'花月','三月':'梅月'} print(dict1) # {'一月': '正月', '二月': '花月', '三月': '梅月'} print(dict1['三月']) # 梅月 dict1['一月'] = '端月' print('一月是', dict1['一月']) # 一月是 端月 del dict1['一月'] print(dict1) # {'二月': '花月', '三月': '梅月'} dict1['一月'] = '正月' print(dict1) # {'二月': '花月', '三月': '梅月', '一月': '正月'} print('1月' in dict1) # False del dict1 #print(dict1) # NameError: name 'dict1' is not defined. Did you mean: 'dict'?
字典進階操作
Python 的字典型別內建許多方法,方便我們進行進階操作。
| 方法 | 功能說明 |
|---|---|
dict | 功能:建立一個新字典。 語法: dict(元組或串列)說明:運用 dict() 函式轉換元組和串列為字典,傳入資料必須成對,前者轉換成字典的鍵,後者轉換為值。 |
fromkeys | 功能:建立一個新字典。 語法: dict.fromkeys(元組或串列[, 預設值])說明:以 fromkeys 轉換元組或串列為字典的鍵,所有鍵的值為第二個參數,若省略第二參數,預設為「None」。 |
keys | 功能:傳回字典中所有的鍵。 語法: 字典.keys()說明:顯示 dict1字典中所有的鍵。 |
values | 功能:傳回字典中所有的值。 語法: 字典.values()說明:顯示 dict1字典中所有的值。 |
items | 功能:傳回字典中所有的元素。 語法: 字典.items()說明:顯示 dict1字典中所有的元素。 |
get | 功能:傳回字典中指定鍵所對應的值。 語法: 字典.get(key[, value])說明: get用來查詢「三月」是否為字典的鍵,如果有就傳回其對應的值;如果不是則傳回第二個參數,若省略第二參數,預設為「None」。 |
setdefault | 功能:傳回字典中指定鍵所對應的值,如果該鍵不存在會新增該鍵。 語法: 字典.setdefault(key[, value])說明: setdefault和get的功能類似,其差異點是如果鍵不存在setdefault會新增以key為鍵的新元素。而第二個參數設定為該元素的值,若省略第二參數,預設值為「None」。 |
pop | 功能:傳回字典中指定鍵所對應的值,並刪除該元素。 語法: 字典.pop(key[, value])說明:使用 pop時,如果鍵存在,回傳其值,之後刪除此元素;如果鍵不存在,回傳第二參數,此時如果第二參數省略會產生錯誤訊息。若字典內無元素則會產生錯誤訊息。 |
popitem | 功能:隨機傳回字典中的元素,並刪除該元素。 語法: 字典.popitem()說明:使用 popitem不用參數,因為這方法會隨機傳回一個元素,再刪除該元素。該留意的是如果使用於空字典,會產生錯誤訊息。 |
update | 功能:以dict2中的元素,更新dict1。語法: dict1.update(dict2)說明: update會將dict2與dict1合併,假使dict2有dict1不存在的鍵,則新增該元素到dict1;反之以dict2的值覆蓋dict1該元素的值。 |
clear | 功能:清除字典內所有元素。 語法: 字典.clear()說明: clear會刪除字典內所有元素,使其成為僅保留名稱的空字典。 |
[例] 字典進階操作。 (dict_2.py)
程式碼: dict_2.py
''' 建立一個新字典(說明註解) 說明 dict() 函式建立字典時,若傳入序列(Iterable),只接受 1 個主要的位置引數 (Positional Argument) (註解說明:傳入的資料結構最外層必須是一個整體包裹起來的容器) 使用 dict() 將一個「包含 Tuple 元素」的雙層 Tuple 轉換為字典 最外層括號包裹住兩個鍵值對 (('一月','正月'), ('二月','花月')),傳入單一 Iterable 物件 ''' # =============== dict ================ # 使用 dict(元組或串列) 將一個「包含 Tuple 元素」的雙層 Tuple 轉換為字典 dict1 = dict((('一月','正月'),('二月','花月'))) # 印出轉換後的字典 dict1,結果為 key-value 形式:{'一月': '正月', '二月': '花月'} print(dict1) # 輸出結果 {'一月': '正月', '二月': '花月'} # 使用 dict() 將一個「包含 List 元素」的雙層 List(清單)轉換為字典 # 最外層中括號包裹住兩個鍵值對 [['一月','正月'], ['二月','花月']],同樣也是傳入單一 Iterable 物件 dict1 = dict([['一月','正月'],['二月','花月']]) # 印出轉換後的字典 dict1,結果同樣為 key-value 形式:{'一月': '正月', '二月': '花月'} print(dict1) # 輸出結果 {'一月': '正月', '二月': '花月'} # ============= fromkeys ============== # 使用 dict.fromkeys(元組或串列,預設值) 建立新字典,傳入包含 key 的元組 ('四月', '五月') dict2 = dict.fromkeys(('四月','五月')) # 印出字典 dict2 的內容 # 當未指定初始 Value(預設值)時,Python 會自動將所有 Key 的 Value 設為 None print(dict2) # 輸出結果 {'四月': None, '五月': None} # 使用 dict.fromkeys() 建立新字典,第一個引數傳入 Key 的串列 ['一月', '四月'] # 第二個引數傳入指定預設值 '端月',此時所有 Key 都會被賦予相同的 Value ('端月') dict2 = dict.fromkeys(['一月','四月'],'端月') # 印出字典 dict2 的內容 print(dict2) # 輸出結果 {'一月': '端月', '四月': '端月'} # =============== keys ================ # 使用 keys() 傳回字典中所有的鍵(Key),回傳型態為 dict_keys 物件 print(dict1.keys()) # 輸出結果 dict_keys(['一月', '二月']) # ============== values =============== # 使用 values() 傳回字典中所有的值(Value),並用 tuple() 將其轉為元組包裝 print(tuple(dict1.values())) # 輸出結果 ('正月', '花月') # =============== items =============== # 使用 items() 傳回字典中所有的 (Key, Value) 鍵值對元組,並用 list() 將其轉為清單包裝 print(list(dict1.items())) # 輸出結果 [('一月', '正月'), ('二月', '花月')] # =============== get ================= # 使用 get(key[,value]) 尋找字典中指定鍵 ('三月') 所對應的值;因為鍵不存在且未設定預設值,所以回傳 None(程式不會報錯) print(dict2.get('三月')) # 輸出結果 None # ============= setdefault ============= # 使用 setdefault(key[,value]) 尋找鍵: # 1. 若 Key 已存在(如 '一月'),直接傳回原有的 Value ('端月'),後方設定的預設值 '梅月' 被忽略,字典不變 print(dict2.setdefault('一月', '梅月')) # 輸出結果 端月 print(dict2) # 輸出結果 {'一月': '端月', '四月': '端月'} # 2. 若 Key 不存在(如 '三月'),會自動將 ('三月': '梅月') 新增至 dict2 中,並回傳設定的新 Value ('梅月') print(dict2.setdefault('三月', '梅月')) # 輸出結果 梅月 print(dict2) # 輸出結果 {'一月': '端月', '四月': '端月', '三月': '梅月'} # ============= pop ============= # 使用 pop(key[,value]) 刪除指定 Key 並傳回其對應的 Value: # 1. 若刪除的 Key 不存在(如 '10 月'),但有傳入第二個參數預設值 ('NONE'),則不會報錯並傳回該預設值 # dict1 = {'一月': '正月', '二月': '花月'} print(dict1.pop('10 月', 'NONE')) # NONE # 2. 刪除指定的 Key(修正:將原本不存在的 '10月' 改為已存在的 '二月'),刪除後傳回 '花月' print(dict1.pop('二月')) # 花月 print(dict1) # 輸出結果 {'一月': '正月'} # ============= popitem ============= # 使用 popitem() 移除並傳回字典中的「最後一筆」鍵值對(Tuple 形式) # (注意:此處改作用於剛新增過項目的 dict2 示範) # dict2={'一月': '端月', '四月': '端月', '三月': '梅月'} print(dict2.popitem()) # 輸出結果 ('三月', '梅月')(dict2 中最新加入的項目被移除) # ============= update ============= # 使用 update() 整合兩個字典:將 dict2 中的所有鍵值對合併至 dict1 中 # 若 Key 已存在(如 '一月'),dict2 的值 ('端月') 會覆蓋 dict1 原本的值 ('正月') # dict1={'一月': '正月'} # dict2={'一月': '端月', '四月': '端月'} dict1.update(dict2) print(dict1) # 輸出結果 {'一月': '端月', '四月': '端月'} # ============= clear ============= # 使用 clear() 清空字典內的所有元素,使其變成空字典 dict1.clear() print(dict1) # 輸出結果 {}
[簡例] 使用者可以輸入貨號,查詢品名和售價。如果該貨號不存在,則可以新增資料。 (檔名:search.py)
程式碼: search.py
# 建立一個名為 datas 的字典(Dictionary),儲存商品資料 # Key 為貨號(字串),Value 為包含 [品名, 售價] 的串列(List) datas = {'A001':['汽水',25], 'A005':['公主麵',10], 'A006':['口香糖',8], 'A003':['冰棒',20]} # 提示使用者輸入貨號,並將輸入的字串儲存至變數 num 中 num=input('請輸入貨號:') # 檢查使用者輸入的貨號 (num) 是否「不存在」於字典 (datas) 的 Key if num not in datas: # 若貨號不存在,印出提示訊息告知使用者該貨號不存在 print(f'貨號:{num} 不存在') # 提示使用者輸入品名,將輸入的字串儲存至變數 name name=input('請輸入品名:') # 提示使用者輸入售價,並使用 int() 將輸入的字串強制轉換為整數後儲存至變數 money money=int(input('請輸入售價:')) # 將新貨號作為 Key,[品名, 售價] 串列作為 Value,新增至 datas 字典中 datas[num]=[name,money] # 使用字典的 .get() 方法取得指定貨號 (num) 對應的 Value(即 [品名, 售價] 串列),並賦予變數 d d = datas.get(num) print(f'貨號:{num} 品名:{d[0]} 售價:{d[1]}元')
[結果]
# CASE1
請輸入貨號 : A003
貨號 : A003 品名: 冰棒售價 : 20 元
# CASE2
請輸入貨號 : A002
貨號 : A002 不存在
請輸入品名 : 豆干
請輸入售價 : 15
貨號 : A002 品名 : 豆干售價 : 15 元相關主題與延伸閱讀
- 1. 元組:元組同樣是容器資料型別,可比較其不可變性與字典鍵值唯一性的異同。
- 3. 集合:可將字典的鍵轉換為集合,進行去除重複或交集等運算。
- 4. 元組、字典和集合的比較與使用時機:統整字典與元組、集合的選用時機。
- 4. 文字檔資料的寫入與讀取:字典資料常搭配檔案讀寫,用來儲存與還原查詢資料。
- 5. 例外處理:查詢不存在的鍵值時,可搭配例外處理避免程式中斷。