字典对象在 Python 中提供专门的方法,用于安全取值、合并、按缺省创建键、删除与浅拷贝,以及获取键、值与键值对的视图。与列表方法类似,部分方法仅查询,部分会修改原字典。本节按使用频率说明常见接口,并给出对照表。

keys、values、items

keys、values、items 分别返回键、值与 (键, 值) 对的视图。字典随后被修改时,视图内容同步变化,并非创建视图时刻的静态快照:

d = {"a": 1, "b": 2}
print(d.keys())      # dict_keys(['a', 'b'])
print(d.values())    # dict_values([1, 2])
print(d.items())     # dict_items([('a', 1), ('b', 2)])

视图不支持下标访问。需要列表或须传给只接受序列的接口时,可使用 list(...) 包装:

print(list(d.keys()))      # ['a', 'b']
print(list(d.items()))     # [('a', 1), ('b', 2)]

get:安全取值

键存在时,方括号与 get 均可取值。键缺失时,方括号抛出 KeyError,get 返回 None 或第二个实参指定的缺省值。读取配置或可选字段时,get 可减少显式分支:

d = {"a": 1}
print(d.get("a"))          # 1
print(d.get("x"))          # None
print(d.get("x", 0))       # 0

update:合并字典

update 将另一映射中的键值写入当前字典,同名键以传入侧为准,原字典被就地修改。若须得到合并结果而不修改原对象,自 Python 3.9 起可使用 | 生成新字典:

a = {"x": 1, "y": 2}
b = {"y": 100, "z": 3}
a.update(b)
print(a)                   # {'x': 1, 'y': 100, 'z': 3}

# Python 3.9+
# merged = {"x": 1, "y": 2} | {"y": 100, "z": 3}

setdefault:有则取、无则设

setdefault(key, default) 在键已存在时返回原值,不存在时写入 default 并返回该值。计数与按键分组时常与 get 配合或替代手动判断:

counts = {}
for word in ["apple", "banana", "apple"]:
    counts[word] = counts.get(word, 0) + 1
print(counts)              # {'apple': 2, 'banana': 1}

counts2 = {}
for word in ["a", "b", "a"]:
    counts2.setdefault(word, 0)
    counts2[word] += 1
print(counts2)             # {'a': 2, 'b': 1}

嵌套字典中可先 setdefault(key, []) 或 setdefault(key, {}),再向返回的容器写入,以避免重复检测键是否存在。

pop、popitem、clear

pop(key) 删除指定键并返回值,可提供缺省实参以免键不存在时抛错。popitem 删除并返回最后插入的键值对(自 3.7 起字典保序)。clear 删除全部条目,字典对象仍存在:

d = {"a": 1, "b": 2, "c": 3}
print(d.pop("a"))          # 1
print(d)                   # {'b': 2, 'c': 3}

print(d.popitem())         # ('c', 3)
print(d)                   # {'b': 2}

d.clear()
print(d)                   # {}

copy:复制字典

b = a 仅增加对同一字典的引用,修改 b 即修改 a。copy() 为浅拷贝:顶层键互不影响,但若值为列表或嵌套字典,两侧仍共享同一内部对象。仅当修改顶层键的绑定(如 b["y"] = 2)时,原字典可保持不变:

a = {"x": 1}
b = a.copy()
b["y"] = 2
print(a, b)                # {'x': 1} {'x': 1, 'y': 2}

若值内含可变对象且须完全断开共享,应使用标准库 copy.deepcopy,与字典自带的 copy() 层次不同。

常用方法总表

方法作用
keys() / values() / items()键 / 值 / 键值对视图
get(key, default)安全取值,避免 KeyError
update(other)合并进当前字典,同键覆盖
setdefault(key, default)有则取、无则写入缺省
pop(key, default)删除并返回,可带缺省
popitem()删除并返回最后一项
clear()清空
copy()浅拷贝

读可选字段常用 get,合并配置常用 update 或 |,按键累计常用 setdefault 或 get,遍历键值常用 items,上述接口覆盖多数日常用法。

本节归纳了 Python 字典对象的常用方法及视图语义。下一篇介绍函数:def 定义、调用与返回值。