上一章我们已经认识了字典。
你可以把字典理解成一张带字段的信息表。 比如一个学生,不再是死记硬背第 0 个是什么、第 1 个是什么,而是直接通过 姓名、年龄、成绩 这些字段去取值。
但只会定义字典,还远远不够。
真正写程序时,你最常干的事情其实是这五类:
查一个字段 加一个字段 改一个字段 删一个字段 把整份数据遍历一遍
这就是所谓的增删改查与遍历。
如果说上一章是在认识字典,那么这一章,才算是真正开始用字典。
一、先准备一个最常用的字典例子
为了把知识讲透,我们先准备一份学生信息:
student = {'name': '张三','age': 18,'gender': '男','score': 95}
后面的所有操作,基本都围绕这个例子来展开。
这样你不会感觉知识点是碎的,而是能看到它们在同一份数据上怎么连续使用。
二、查:先学会从字典里拿数据
查,是最基础的一步。
字典不像列表那样按位置取值,它是按键来找值。
student = {'name': '张三','age': 18,'gender': '男','score': 95}print(student['name'])print(student['score'])
输出:
张三95
这就是最直接的取值方式。
你给出键,Python 就把对应的值拿出来。
写字典时,你会越来越体会到一个好处:
字段名本身就是说明。
看到 student['score'],你几乎不用猜。 可如果是 data[3],你常常得回头翻前面的定义。
所以字典一旦用熟,你会发现代码阅读体验会好很多。
三、查值时最容易踩的坑:键不存在
先看一段代码:
student = {'name': '张三','age': 18}print(student['score'])
这段代码会直接报错。
为什么?
因为 score 这个键根本不存在。
也就是说,用中括号取值时,你必须保证这个键真的有。 只要键名写错,或者字段本来就没这个内容,程序就会炸。
这在真实项目里是很常见的坑。
比如接口里有时候返回手机号,有时候不返回。 你如果想当然地直接去取,很容易报错。
所以除了中括号取值,我们还要学一个更稳的方式。
四、get():更安全的取值方法
字典里有个非常常用的方法,叫 get()。
它的作用就是:
取值的时候更温和,不会因为键不存在而直接报错。
看例子:
student = {'name': '张三','age': 18}print(student.get('name'))print(student.get('score'))
输出:
张三None
注意这里的区别:
student['score'] 会报错student.get('score') 不报错,只会返回 None
这就安全得多。
你还可以给它一个默认值:
print(student.get('score', 0))
输出:
0
意思就是:
如果有 score,就返回它 如果没有,就先给我一个默认值 0
这在业务里特别实用。
比如:
没有昵称,就显示游客 没有分数,就按 0 算 没有城市,就显示未知地区
看一个更生活化的例子:
user = {'username': 'tom','email': 'tom@example.com'}nickname = user.get('nickname', '游客')print(nickname)
输出:
游客
所以这一小节你要记住一句非常实用的话:
中括号适合确定有这个键的时候get() 适合不确定这个键在不在的时候
五、增:给字典新增一个键值对
字典新增内容非常简单,直接赋值就行。
student = {'name': '张三','age': 18}student['score'] = 95print(student)
输出:
{'name': '张三', 'age': 18, 'score': 95}
你会发现,没有什么专门的 add 方法。 因为对字典来说,新增一个键值对,本质上就是给一个新键赋值。
这点和列表不太一样。 列表新增通常会想到 append()。 字典新增,直接用等号。
再来一个例子:
student['city'] = '北京'print(student)
输出:
{'name': '张三', 'age': 18, 'score': 95, 'city': '北京'}
是不是很直接。
字典这套设计有个很妙的地方:
如果键原本没有,就是新增 如果键原本有了,就是修改
也就是说,同样一行代码,既可能是新增,也可能是修改。关键看这个键原来在不在。
六、改:修改已有键对应的值
如果键已经存在,你再赋值,效果就是修改。
student = {'name': '张三','age': 18,'score': 95}student['score'] = 98print(student)
输出:
{'name': '张三', 'age': 18, 'score': 98}
原来 score 是 95,现在变成了 98。
这个操作看着普通,但在实际开发里用得非常多。
比如:
修改用户昵称 更新库存 刷新登录时间 调整订单状态
本质上都是改某个键对应的值。
比如商品库存:
product = {'name': '键盘','price': 299,'stock': 50}product['stock'] = 49print(product)
这就是一次很典型的更新操作。
七、同样是赋值,怎么区分是新增还是修改
这是很多新手一开始会迷糊的点。
看下面这两句:
student['score'] = 95student['age'] = 20
第一句可能是新增。 第二句可能是修改。
判断方法只有一个:
看这个键之前存不存在。
如果不存在,就是新增。 如果已经存在,就是修改。
你不需要额外写两套语法,Python 会自动帮你处理。
这一点其实很省脑子。
八、删:del 删除键值对
字典里的删除,最常见的是用 del。
student = {'name': '张三','age': 18,'score': 95}del student['age']print(student)
输出:
{'name': '张三', 'score': 95}
age 这个键值对就被删掉了。
这里要注意,del 删除的是整组内容,不是只删值不删键。 字典里键和值是一对一对绑在一起的。
删的时候也有一个坑:
如果你删的键根本不存在,也会报错。
比如:
del student['gender']
如果 gender 本来就没有,程序就会报错。
所以 del 适合你非常确定这个键存在的时候用。
九、pop():删除并顺手拿到被删掉的值
有时候,我们不只是想删除,还想知道删掉的到底是什么。
这时候可以用 pop()。
student = {'name': '张三','age': 18,'score': 95}age = student.pop('age')print(age)print(student)
输出:
18{'name': '张三', 'score': 95}
你看,pop() 很像一种顺手带走。
一边删 一边把删掉的值拿回来
这在很多场景里都很好用。
比如用户退出登录时,把 token 从字典里移除,同时记录一下被移除的值。 比如处理参数时,把一个字段拿出来后就不再保留。
不过也要注意:
如果你 pop() 一个不存在的键,也会报错。
你也可以给默认值,避免报错:
result = student.pop('gender', '没有这个字段')print(result)
输出:
没有这个字段
这种写法在防御性编程里很常见。
十、clear():一键清空字典
如果你想把字典里的内容全部清空,可以用 clear()。
student = {'name': '张三','age': 18,'score': 95}student.clear()print(student)
输出:
{}
这时候字典还在,只是里面的内容没了。
你可以把它理解成:
不是把这个箱子扔了 而是把箱子里的东西全倒空了
这和变量直接重新赋值为空字典虽然结果类似,但语义上还是稍微有点区别。
十一、len():快速看字典里有多少组数据
字典里最常见的统计动作,不是求和,而是先看字段数量。
student = {'name': '张三','age': 18,'gender': '男','score': 95}print(len(student))
输出:
4
因为它有 4 个键值对。
你以后处理配置、接口返回、表单提交时,经常会先看看字典里到底装了多少项。len() 就是最直接的方式。
十二、in 和 not in:判断键在不在
字典里也能用 in。
但这里有个重要细节:
对字典使用 in,判断的是键,不是值。
看代码:
student = {'name': '张三','age': 18,'score': 95}print('name'in student)print('gender'in student)
输出:
TrueFalse
它看的不是有没有值叫张三,而是有没有键叫 name。
这一点很重要。
比如你想在修改前先判断字段在不在:
if'score'in student: student['score'] = 100
这就很稳。
很多时候,先判断再操作,比上来就硬取要安全。
十三、update():一次更新多组数据
前面我们说过,字典可以一组一组地新增或修改。 但如果你一次要更新很多项,一个个写就有点慢。
这时候可以用 update()。
student = {'name': '张三','age': 18}student.update({'age': 20,'score': 96,'city': '上海'})print(student)
输出:
{'name': '张三', 'age': 20, 'score': 96, 'city': '上海'}
这里发生了三件事:
age 原来有,所以被修改score 原来没有,所以被新增city 原来没有,所以也被新增
这就是 update() 的好处。
一口气更新一批字段,非常适合处理接口参数、配置合并、默认值覆盖这些场景。
十四、遍历字典:真正开始批量处理数据
前面的增删改查,更多是在单独操作某一个字段。 但程序里更常见的情况是:
我要把整个字典扫一遍
这就进入遍历了。
遍历字典,是你把字典真正用起来的关键一步。
十五、直接遍历字典,拿到的是键
先看最基础的写法:
student = {'name': '张三','age': 18,'score': 95}for key in student: print(key)
输出:
nameagescore
注意,直接 for key in student,拿到的是键,不是值。
这一点一定要记住。
很多新手第一次写时,以为会把整组内容取出来,结果打印出来全是字段名,然后就懵了。
其实这是字典的默认遍历规则。
十六、通过键再去拿值
既然遍历时拿到的是键,那我们就可以再根据键去取值。
student = {'name': '张三','age': 18,'score': 95}for key in student: print(key, student[key])
输出:
name 张三age 18score 95
这就是最经典的字典遍历方式。
先拿键 再根据键拿值
你以后做数据展示、打印信息、生成报表时,这个写法会非常高频。
十七、keys():只看所有键
虽然直接遍历字典本身就能拿到键,但有时候为了代码更清楚,也会显式写 keys()。
student = {'name': '张三','age': 18,'score': 95}for key in student.keys(): print(key)
效果和直接遍历字典差不多。
输出:
nameagescore
那为什么还要有 keys()?
因为它表达得更明确。 一眼就能知道,你现在就是在处理所有键。
在教学里,它也能帮新手把思路理顺:
字典里有键,也有值 现在我只拿键这一部分
十八、values():只遍历所有值
如果你只关心值,不关心键,就可以用 values()。
student = {'name': '张三','age': 18,'score': 95}for value in student.values(): print(value)
输出:
张三1895
这种写法在做数据汇总时特别常见。
比如你有一堆商品库存,想把所有库存值拿出来处理。 或者你只想看所有分数,不关心是谁的分数。
这时候 values() 就很顺手。
十九、items():同时拿到键和值
这是字典遍历里最好用的一种方式。
student = {'name': '张三','age': 18,'score': 95}for key, value in student.items(): print(key, value)
输出:
name 张三age 18score 95
这个写法为什么受欢迎?
因为它省事。
不用你先拿键,再单独写一次 student[key]。 直接一次把键和值都拆出来了。
你可以把 items() 理解成:
把字典里的每一组 键:值 都成对拿出来
如果你以后只记一种字典遍历写法,优先记这个。
因为它最完整,也最常用。
二十、一个真实感更强的遍历例子
光看抽象例子还是容易忘,我们来写一个更像实际业务的小场景。
比如你要把用户资料打印成整齐的信息卡:
user = {'用户名': 'coder01','年龄': 20,'城市': '杭州','会员': True}for key, value in user.items(): print(key, ':', value)
输出:
用户名 : coder01年龄 : 20城市 : 杭州会员 : True
这种写法以后你做日志、做表单展示、做信息回显时,都会经常见到。
字典一旦会遍历,很多数据展示就不再难了。
二十一、遍历时修改字典,要小心
这部分是一个容易忽略但很重要的提醒。
一般不建议你在遍历字典的同时,直接对它增删键。
比如这种写法就很危险:
data = {'a': 1,'b': 2,'c': 3}for key in data:if key == 'b':del data[key]
这样很容易出问题。
因为你一边在走这张表,一边又在改这张表的结构。 程序很容易混乱。
更稳的做法是:
先决定哪些要删 遍历结束后再删
或者先复制出一份键列表再操作。
新手阶段先记住一句就行:
遍历时尽量只读少改,尤其别边遍历边删键
二十二、字典增删改查,放在一起看一遍
现在我们把前面的操作串起来,做一个完整演示。
student = {'name': '张三','age': 18}# 查print(student.get('name'))# 增student['score'] = 95# 改student['age'] = 19# 删student.pop('name')# 遍历for key, value in student.items(): print(key, value)
输出大致是:
张三age 19score 95
你会发现,字典这套东西并不复杂。 真正需要你掌握的,不是死背方法名,而是形成操作习惯。
我要拿数据,用什么方式最安全 我要补字段,怎么加 我要更新字段,怎么写 我要删内容,是不是还要顺手拿回旧值 我要批量看内容,用哪种遍历更顺
这才是实战思维。
二十三、字典和列表一起用,才更像真实项目
现实里的数据,常常不是一个字典单独存在,而是很多字典放在一个列表里。
比如学生列表:
students = [ {'name': '张三', 'score': 95}, {'name': '李四', 'score': 88}, {'name': '王五', 'score': 92}]
这时候你就可以这样遍历:
for student in students: print(student['name'], student['score'])
输出:
张三 95李四 88王五 92
你看,一旦字典和列表组合起来,程序就开始有一点项目味道了。
所以这章虽然讲的是字典基本操作,但它其实是在给后面的项目开发打地基。
二十四、最容易犯的几个错,提前帮你避坑
先说第一个。
很多人会把字典当列表,写出这样的代码:
student[0]
这是不对的。 字典不是按位置取值,而是按键取值。
第二个坑,是键名写错。
student['scroe']
你以为写的是 score,结果字母顺序错了。 这种错误特别常见,而且肉眼很容易漏过去。
第三个坑,是想当然地取不存在的键。
student['phone']
如果没有这个字段,程序就会报错。 不确定时,优先考虑 get()。
第四个坑,是边遍历边删除。
这个前面已经提醒过,新手阶段尽量绕开。
二十五、练习题:别看懂就算,自己一定要敲
下面这些练习非常适合巩固这一章。
1. 定义一个商品字典,包含商品名、价格、库存,然后打印商品名
product = {'name': '鼠标','price': 59.9,'stock': 300}print(product['name'])
2. 给这个商品字典新增一个品牌字段
product['brand'] = '罗技'print(product)
3. 把价格改成 49.9
product['price'] = 49.9print(product)
4. 删除库存字段
del product['stock']print(product)
5. 遍历字典,打印所有键和值
for key, value in product.items(): print(key, value)
你把这几步自己敲一遍,字典的基础操作基本就顺了。
二十六、本章小结
这一章你真正要带走的,不只是几个方法名,而是一整套字典操作思路。
查值,最直接的是中括号,不确定键在不在时用 get() 更稳。 新增和修改,都是通过赋值完成。 删除可以用 del,也可以用 pop()。 清空整个字典,用 clear()。 判断键是否存在,可以用 in。 批量处理字典内容,最常用的是 items() 遍历。
把这些放在一起,你就已经掌握了字典最核心的实战能力。
从这一章开始,字典不再只是一个看着懂的数据类型,而是真正成了你手里的工具。
下一章我们继续讲 集合 set 入门:去重为什么这么高效。 到了那里,你会发现,原来有些问题用列表做很笨,用集合却能一下子变轻松。