news 2026/10/17 13:51:21

Python编程基础之字典

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python编程基础之字典

前言


刚开始学 Python 的人常会问:列表(list)已经能存一串数据了,为什么还要学字典?答案藏在一个很具体的场景里——当你要保存的是「成对」的数据,比如每门课对应一个分数、每个人对应一个电话,列表就不够用了。


用列表硬凑成对数据,通常得开两个列表,一个存「名字」,一个存「分数」,靠下标位置对齐。位置一旦错位,数据就会张冠李戴,而且查一个名字要先遍历找下标,非常别扭。字典正是为这种「一对一」关系设计的:它存的不是单个元素,而是一个个键值对(key-value pair)。


本文是零基础入门篇,只讲最基础的概念和四个动作:建、查、改、加。不涉及哈希表原理、不提defaultdict、不碰合并运算符,保证每一步都能照着写下来。所有示例用 Python 3 编写。


一、先看看没有字典时的麻烦


假设要记录三个同学的年龄,用列表只能这样:


# 适用于 Python 3.8+
names = ["小明", "小红", "小刚"]
ages = [18, 19, 17]

# 想查小红的年龄,得先找下标
i = names.index("小红")
print(ages[i]) # 19

这段代码能跑,但问题很明显:两个列表必须始终保持长度一致、顺序一致。如果哪天有人只往names里加了一个人而忘了同步ages,第 3 个同学的年龄就会对到第 4 个名字上。数据一多,这种错误几乎无法避免。


二、键值对是什么


字典把「名字」和「年龄」放在同一条记录里,绑死在一起:


# 适用于 Python 3.8+
ages = {"小明": 18, "小红": 19, "小刚": 17}

花括号里的每一项都是键: 值。"小明"是键(key),18是值(value),冒号把它们连成一对,逗号分隔不同的对。这样「小明」和 18 就再也不会被拆散了。


读起来也直观:键是「拿什么去查」,值是「查出来的结果」。键必须唯一,值可以重复——两个人可以有同样的年龄,但不能有两个人共用同一个名字当键(真重复了,后面的会覆盖前面的)。


三、最基础的四个动作


学字典先记住四件事:建、查、改、加。


建就是写花括号。想建一个空字典,写{}或dict()。


# 适用于 Python 3.8+
empty = {} # 空字典
ages = {"小明": 18, "小红": 19}
print(len(ages)) # 2

查是用方括号把键放进去:


# 适用于 Python 3.8+
ages = {"小明": 18, "小红": 19}
print(ages["小明"]) # 18

查的时候键必须存在,否则会报KeyError。不确定键在不在,可以用in先问一句,或者用get():


# 适用于 Python 3.8+
ages = {"小明": 18}
print("小明" in ages) # True
print("小刚" in ages) # False
print(ages.get("小刚", 0)) # 0,键不在就返回给出的默认值

改和加用的是同一句写法d[键] = 值。键原来在,就是改;原来不在,就是加。


# 适用于 Python 3.8+
ages = {"小明": 18}
ages["小明"] = 19 # 键存在 → 改
ages["小刚"] = 17 # 键不存在 → 加
print(ages) # {'小明': 19, '小刚': 17}

删除用del:


# 适用于 Python 3.8+
ages = {"小明": 18, "小红": 19}
del ages["小红"]
print(ages) # {'小明': 18}

四、小例子:一个电话簿


把上面的动作串起来,写一个能增、能查、能删的简易电话簿:


# 适用于 Python 3.8+
phonebook = {}

def add(name, number):
phonebook[name] = number

def find(name):
# 找不到时返回一句提示,而不是让程序崩掉
return phonebook.get(name, "查无此人")

def remove(name):
phonebook.pop(name, None) # 第二个参数表示「没有也不报错」

add("小明", "138-0000-0001")
add("小红", "139-0000-0002")
print(find("小明")) # 138-0000-0001
print(find("小王")) # 查无此人

remove("小红")
print(phonebook) # {'小明': '138-0000-0001'}

注意pop的第二个参数:给了它,键不存在时返回它而不报错;不给它,键不存在就抛KeyError。这和列表里list.pop()不带参数删末尾的行为不同,是专门为字典设计的。


五、字典和列表怎么选




场景用列表用字典



一批同类的数据,有先后顺序是一般不用

一对一查找(名字找电话)别扭是

需要按下标读取是不支持

需要按「名字」读取做不到是

数据会重复出现可以键不能重复



一句话:要顺序,用列表;要对应关系,用字典。


六、让字典和循环配合起来


字典单独的用法很简单,真正开始有用是在它和循环配合之后。下面这段把「读取每一项」和「按条件处理」连起来:


# 适用于 Python 3.8+
inventory = {"苹果": 5, "香蕉": 0, "橙子": 3}

# 逐个检查有没有缺货
for name, count in inventory.items():
if count == 0:
print(name, "缺货了")
else:
print(name, "剩", count, "个")

items()一次给出「键」和「值」两个变量,name拿到键、count拿到值。这是遍历字典最常用的写法。如果只关心键,写for name in inventory:就行;只关心值,则写for count in inventory.values():。


再进一步,可以一边遍历一边把结果收集到新字典里:


# 适用于 Python 3.8+
prices = {"苹果": 3, "香蕉": 2, "橙子": 4}
doubled = {}
for name, price in prices.items():
doubled[name] = price * 2 # 放进一个新字典
print(doubled) # {'苹果': 6, '香蕉': 4, '橙子': 8}

这里doubled[name] = price * 2用的是最基本的赋值:新字典里没有这个键,就当作新增;已经有了,就覆盖。循环里一个写法既能新增又能更新,正是字典方便的地方。


常见坑点


坑一:把不存在的键当普通下标查。


# 适用于 Python 3.8+
# ❌ 键没写对就崩
d = {"小明": 18}
print(d["小明 "]) # 多了一个空格 → KeyError
# ✅ 不确定时用 get() 兜底
print(d.get("小明 ")) # None

坑二:以为in判断的是值。


# 适用于 Python 3.8+
# ❌ in 只看键,不看值
d = {"小明": 18}
print(18 in d) # False,容易看错
# ✅ 要判断值就先取出来
print(18 in d.values()) # True

坑三:键和值的位置写反。


# 适用于 Python 3.8+
# ❌ 想用名字查年龄,却把年龄写成了键
d = {18: "小明"}
print(d["小明"]) # KeyError: '小明'
# ✅ 拿什么去查,什么就放在冒号左边
d = {"小明": 18}
print(d["小明"]) # 18

坑四:键的拼写不一致,悄悄变成两条记录。


# 适用于 Python 3.8+
# ❌ 'name' 和 'Name' 是两个不同的键
d = {}
d["name"] = "小明"
d["Name"] = "小红"
print(d) # {'name': '小明', 'Name': '小红'}
# ✅ 统一拼写规范
d = {"name": "小明"}

坑五:重复的键以为能都留下。


# 适用于 Python 3.8+
# ❌ 同一个键后写会覆盖前面
d = {"a": 1, "a": 2}
print(d) # {'a': 2}
# ✅ 值本身要多个,就存一个列表
d = {"a": [1, 2]}

坑六:想加一项却用了列表的append。


# 适用于 Python 3.8+
# ❌ 字典没有 append
d = {}
d.append(("a", 1)) # AttributeError: 'dict' object has no attribute 'append'
# ✅ 加一项就是给它一个键值
d["a"] = 1
print(d) # {'a': 1}

坑七:整数键和字符串键混用。


# 适用于 Python 3.8+
# ❌ 1 和 "1" 是两个不同的键
d = {1: "数字一"}
d["1"] = "字符串一"
print(d) # {1: '数字一', '1': '字符串一'}
# ✅ 统一键的类型,别混着用
d = {"1": "数字一"}
print(len(d)) # 1

总结




动作写法别名



建{"键": "值"}/{}花括号

查d["键"]/d.get("键", 默认)后者更安全

改d["已存在的键"] = 新值位置不变

加d["新键"] = 值追加到末尾

删del d["键"]/d.pop("键")pop可带默认值

判存在"键" in d判断的是键



字典的核心就一句话:用键去换值。只要记住键必须唯一、d["k"]缺键会报错而d.get("k")不会、in判断的是键,入门阶段就不会踩大坑。




版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/17 13:50:17

Java泛型从入门到原理:类型擦除、通配符与实战避坑指南

如果你写过几年 Java,一定在某个深夜被ClassCastException支配过——那一行异常信息只告诉你哪里转失败了,就是不告诉你到底传进来的是什么。泛型就是解决这个问题的,它把本该在运行期爆发的类型问题,直接摁死在编译期。这篇就围绕…

作者头像 李华
网站建设 2026/10/17 13:50:17

SAP MM寄售全流程实施:从主数据配置到MRKO结算

简介:本资源是一份面向SAP MM模块初、中级实施顾问与企业供应链信息化人员的供应商寄售全流程实操指南,聚焦解决寄售业务在SAP系统中配置难、操作易出错、结算逻辑不清晰等典型问题。文档以结构化步骤详解11个关键环节,涵盖MRP2视图采购类型“…

作者头像 李华
网站建设 2026/10/17 13:50:08

A-Star算法迷宫小游戏:从原理到Word论文的完整实现方案

简介:这是一份面向计算机相关专业毕业设计或课程论文写作的参考文档,主题为基于A-Star搜索算法的迷宫小游戏设计。文档以毕业论文格式排版,涵盖了摘要、关键词、导言、相关理论、技术实施、结果讨论与参考文献等完整章节,重点阐述…

作者头像 李华
网站建设 2026/10/17 13:49:52

RAL电子色卡使用指南:看懂编码、提取色号、避坑实操

简介:劳尔色卡电子版是以文档格式保存的官方色号速查文件,面向平面设计师、工业产品设计师、建筑与室内设计从业者,以及制造、印刷、涂料等领域的色彩管理人员,帮助用户在项目选色、远程沟通、生产校对等环节快速统一颜色标准。资…

作者头像 李华
网站建设 2026/10/17 13:46:58

图算法入门:邻接矩阵与邻接表存储,DFS和BFS遍历实战

简介:这是一份面向算法学习者的图解数据结构笔记,聚焦“图”这一复杂非线性结构。内容从图的定义出发,系统梳理无向图、有向图、邻接点、顶点的度、完全图、子图、路径与回路、连通分量、强连通分量以及带权值的网等核心概念,并对…

作者头像 李华
网站建设 2026/10/17 13:38:47

华为公司职位分析:财经专员(终端财经BP)

本文严格依据华为官方财经专员(终端财经BP)岗位任职要求、核心岗位职责撰写,聚焦华为终端BG全场景消费业务(手机、平板PC、智能汽车、鸿蒙生态、AI终端),围绕经营分析、预算预测、交易流财经管控、项目四算…

作者头像 李华