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)
三種檢視可提供明確的存取方式:
dict.keys()——所有鍵(與迭代字典相同)。dict.values()——所有值。dict.items()——(key, value)元組,非常適合在迴圈中解包。
for key, value in person.items():
print(key, "=", value)
2.9.5. 什麼能當作鍵¶
字典的鍵必須是可雜湊的(hashable)——它們的值在生命週期內不能改變。常見的可雜湊型別有:
像 list、dict 和 bytearray 這類可變型別不能當作鍵;使用它們會引發 TypeError。由不可變值組成的元組是以複合識別碼(例如二維格點座標)作為字典鍵的標準做法:
>>> grid = {}
>>> grid[(0, 0)] = "start"
>>> grid[(5, 7)] = "end"
2.9.6. 長度¶
len() 會回傳項目的數量:
>>> len(person)
4