HOWTO · Python
初始化 Python 字典
本教程演示如何在 python 中初始化字典
本頁內容
Python 字典會儲存鍵值配對,讓程式能透過鍵查找對應的值。請依資料形式選擇初始化方式:已知配對可直接寫成字典常值;已有配對或關鍵字引數時可使用 dict();多個鍵共用同一個值時可使用 dict.fromkeys();若要依資料推導項目,則可使用字典推導式。以下範例會說明各種形式的行為。
使用字典常值初始化字典
如果鍵和值在程式碼中已知,使用字典常值最直接。將每個鍵和值放在大括號內,以冒號分隔,並用逗號分開各組配對。字典中的鍵必須唯一;如果常值中重複指定同一個鍵,會保留最後指定的值。
執行以下範例(程式碼及任何顯示的標籤或輸出維持英文):
本節中的程式碼以及顯示的標籤或輸出仍為英文。
dict1 = {"X": 2, "Y": 3, "Z": 4}
print(dict1)
這會建立三個字串鍵,並將它們對應至整數值。若要表示小型且固定的對照表,字典常值通常最清楚。
使用 dict() 建構函式初始化字典
dict() 建構函式接受關鍵字引數,或由鍵值配對組成的可迭代物件。關鍵字名稱會成為字串鍵;如果鍵不是有效的識別字,或本身不是字串,請改用配對資料。例如,dict(X=1, Y=2) 建立的對照內容與 {"X": 1, "Y": 2} 相同。若要轉換現有配對,可將它們作為可迭代物件傳入,例如 dict([("X", 1), ("Y", 2)])。
當資料原本就是配對形式時,使用建構函式相當方便。如果配對序列中有重複鍵,後面的配對值會成為該鍵保留的值。
使用 dict.fromkeys() 為多個鍵指定共用預設值
dict.fromkeys() 會從鍵的可迭代物件建立新字典,並為每個鍵指定相同的值。如果省略此值,則會使用 None,例如 dict.fromkeys(["X", "Y", "Z"])。
這種方式適合用於不可變的預設值,例如 None、0 或字串。若指定串列等可變值,請特別留意:所有鍵都會指向同一個串列物件,因此透過其中一個鍵修改串列,也會反映在其他鍵上。如果每個鍵都需要各自獨立的可變值,請改用字典推導式,例如 {key: [] for key in keys}。
從配對或平行可迭代物件建立字典
如果記錄中已包含鍵值配對,可直接將可迭代物件傳給 dict()。元組串列可以使用;其他每個項目都包含兩個值的可迭代物件也可以,例如 dict([("X", 5), ("Y", 6), ("Z", 8)])。
如果鍵和值分別儲存,請使用 zip() 將它們配對,再把配對傳給 dict()。例如,dict(zip(["X", "Y", "Z"], [5, 6, 8])) 會將每個鍵對應至相同位置的值。zip() 會在任一可迭代物件耗盡時停止,因此較長物件中多出的項目不會納入字典。如果產生的配對中有重複鍵,會保留最後一個值。
使用字典推導式建立字典
字典推導式能用一個運算式,從可迭代物件推導出字典項目。一般形式為 {key_expression: value_expression for item in iterable}。例如,{name: 0 for name in ["Ada", "Lin"]} 會為每個名稱設定初始值 0。
當鍵或值需要根據輸入資料計算,或每個鍵都需要自己的新可變值時,適合使用字典推導式。它等同於先建立空字典,再在迴圈中逐項指派值。請保持運算式簡潔;如果轉換步驟較多,使用一般迴圈會更容易閱讀。
使用 setdefault() 為缺少的鍵新增預設值
setdefault() 會操作現有字典。如果鍵已存在,它會傳回目前的值;否則會以指定的預設值新增該鍵,並傳回此值。例如,counts.setdefault("apples", 0) 會初始化缺少的計數項目,同時保留已存在的計數值。
當字典已存在,而其中某個鍵可能需要初始化時,這個方法就很實用。它不是用來建立完整對照表的建構方式。若要反覆將值分組,可考慮使用 setdefault(key, []),但要留意其行為:每次呼叫都會建立新的串列;對已存在的鍵呼叫時,則會傳回該鍵目前的串列。直接呼叫 __setitem__() 是較底層的替代方式;若只要設定一個項目,使用 mapping[key] = value 這類一般指派會更清楚。
選擇合適的字典初始化方式
若要建立小型且配對內容已知的對照表,使用字典常值。若要使用關鍵字引數或現有配對資料,選擇 dict();若平行可迭代物件的項目位置彼此對應,則搭配 zip()。如果所有鍵都應指向同一個共用預設值,尤其是不可變值,可使用 dict.fromkeys()。若要計算字典項目,或為各鍵建立個別的值,使用字典推導式。若要在已存在的字典中為某個鍵新增預設值,則使用 setdefault()。