Menu

Python 字典:dict 的创建、访问、更新和遍历

字典是 Python 中按键查找值的数据结构,过了入门阶段之后,它是你会一直用到的数据类型。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

字典就是一张查找表

列表是按位置索引的。字典是按“键”索引的,键通常是字符串或数字,每个键都对应一个值。这一个转变,就让一大类程序成为可能:库存、配置、JSON 数据、用户资料、缓存。

键和值几乎可以是任何东西。键必须是可哈希的(也就是数字、字符串、元组,不能是列表或其他字典)。值没有任何限制,字典里可以装任何东西,包括其他字典或列表。

创建字典

有好几种方法,各有各的用处:

读取值

有两种方法,选哪种很重要:

根据意图来选:

  • 用 []:当这个键“必须”存在时。如果它不存在,那就是 bug,你希望程序大声报错。
  • 用 .get():当“不存在”也是正常情况时。它让你不用 try/except 就能写出默认值。

添加、更新、删除

给一个键赋值,要么创建它,要么更新它:

update() 会合并另一个字典或者由键值对组成的可迭代对象:

overrides 中与 settings 重复的键,会覆盖 settings 中原来的值。

检查键是否存在

in 检查的是键,而不是值:

要专门检查值,请用 user.values():

如何遍历字典

你可以遍历三种视图:

大多数时候你会用 .items():它直接给你解包好的键值对,拿来就能用。

在新版本的 Python(3.7+)中,遍历顺序与插入顺序一致。字典不是一个“魔法袋”:如果你依次添加 a、b、c,遍历时它们就按这个顺序出现。这是语言层面的保证,你可以放心依赖。

如何对字典排序

字典会保留插入顺序,所以对字典“排序”,实际上是新建一个字典,让它的键按你想要的顺序插入:

sorted() 返回一个由键值对组成的列表;用 dict(...) 把它包起来,就能按新的顺序重建一个字典。如果你只需要排好序的键值对(而不是字典),就省掉外层的 dict() 调用。

如何合并两个字典

Python 3.9+ 提供了 | 运算符:

键冲突时,右边字典的值优先。.update() 是对应的原地修改写法。在较旧的 Python 版本中,请用 {**defaults, **overrides}。

setdefault 写法

一个常见的需求是:“如果键存在,就用它的值;如果不存在,就先设置一个默认值,再使用它。”

或者,更好的做法是用 collections.Counter:

Counter 是字典的子类,默认就会计数。只要是统计出现次数,用它就对了。

字典推导式

和列表推导式类似,只不过是用来构建字典的:

规则和列表推导式一样,只是花括号里写的是 key: value。

字典是 JSON 的孪生兄弟

Python 字典和 JSON 对象几乎一一对应。在两者之间转换只需要一次调用:

这就是字典在 Web 开发中随处可见的原因:你的 API 请求和响应,本质上就是在操作字典,中间隔着一层网络而已。

一个实用的例子

一个类似配置的小程序,用来记录用户资料:

嵌套字典、可变的值、带默认值的 .get(),这就是处理任何记录类数据的基本工具箱。

继续前进

列表、元组、集合、字典。掌握了这四种集合,你几乎可以表示入门阶段会遇到的任何数据。接下来,我们将学习列表推导式,这是 Python 中把一个集合转换成另一个集合的简洁写法。

常见问题

Python 中的字典是什么?

字典是键值对的集合。你通过键来查找值:写 prices['apple'],而不是 prices[0]。字典的读写速度很快,键必须是唯一的,而且在新版本的 Python 中,字典会保留你插入元素的顺序。

怎么给 Python 字典添加一个键?

直接赋值:my_dict['new_key'] = 'new value'。如果这个键已经存在,它的值会被覆盖;如果不存在,就会被添加进去。“插入”和“更新”没有区别,用的是同一种语法。

dict[key] 和 dict.get(key) 有什么区别?

如果键不存在,dict[key] 会抛出 KeyError。dict.get(key) 则会返回 None(或者你提供的默认值)。当键不存在属于预期内的正常情况时,用 .get();当键不存在意味着 bug 时,用 [key]。

Coddy 编程语言插图

和 Coddy 一起学编程

开始