2.9. 字典

字典(dictionary)是從(key)到(value)的對應。每個鍵都會被直接查找;字典會記住該鍵最後一次關聯到的值。

2.9.1. 建立字典

使用大括號搭配 key: value 配對,或使用 dict 建構函式:

empty   = {}
person  = {"name": "OpenMV", "id": 42}
counts  = dict(a=1, b=2, c=3)            # keyword form
pairs   = dict([("x", 1), ("y", 2)])     # from a list of pairs

值可以是任何型別——字串、數字、串列,甚至是其他字典:

config = {
    "name":  "OpenMV",
    "id":    42,
    "width": 320,
    "tags":  ["red", "round"],
}
字典以兩欄呈現:鍵在左側, 值在右側,並以箭頭連結每一組配對。

字典中的每個鍵都恰好對應到一個值。

2.9.2. 存取與成員測試

使用 [] 進行索引可取得某個鍵對應的值。不存在的鍵會引發 KeyError

>>> person = {"name": "OpenMV", "id": 42}
>>> person["name"]
'OpenMV'
>>> person["missing"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'missing'

若要進行較寬容的查找,可使用 dict.get()。當鍵不存在時,它會回傳 None,或回傳你以第二個引數傳入的值:

>>> person.get("name")
'OpenMV'
>>> person.get("missing")            # returns None
>>> person.get("missing", "n/a")
'n/a'

in 關鍵字測試的是是否存在——而不是值:

>>> "name" in person
True
>>> "OpenMV" in person
False

2.9.3. 新增、更新與移除

d[key] 進行賦值時,若該鍵是新的就會新增項目,若已存在則會覆寫它:

>>> person["seen"] = 1
>>> person["seen"] = 2               # overwrites
>>> person
{'name': 'OpenMV', 'id': 42, 'seen': 2}

移除有幾種形式:

  • del d[key] ——移除一個項目;若該鍵不存在則引發 KeyError

  • dict.pop() ——移除並回傳該值;可選的預設值能讓你避免引發例外。

  • dict.clear() ——移除每一個項目。

dict.update() 會將另一個字典(或一個由 (key, value) 配對組成的串列)合併到接收方,並覆寫任何相符的鍵:

>>> person.update({"id": 100, "owner": "alice"})
>>> person
{'name': 'OpenMV', 'id': 100, 'seen': 2, 'owner': 'alice'}

2.9.4. 迭代

直接迭代字典會依插入順序產生它的鍵:

for k in person:
    print(k)

三種檢視可提供明確的存取方式:

for key, value in person.items():
    print(key, "=", value)

2.9.5. 什麼能當作鍵

字典的鍵必須是可雜湊的(hashable)——它們的值在生命週期內不能改變。常見的可雜湊型別有:

listdictbytearray 這類可變型別不能當作鍵;使用它們會引發 TypeError。由不可變值組成的元組是以複合識別碼(例如二維格點座標)作為字典鍵的標準做法:

>>> grid = {}
>>> grid[(0, 0)] = "start"
>>> grid[(5, 7)] = "end"

2.9.6. 長度

len() 會回傳項目的數量:

>>> len(person)
4