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