零基础学 Python 第7章 | 字典 dict:键值对存储
本章摘要核心目标掌握字典的创建、增删改查、遍历与嵌套能用键值对组织结构化数据核心知识点字典创建、通过键访问值、增/删/改、keys()/values()/items()遍历、嵌套字典、get()安全取值实操产出通讯录管理小程序支持添加、查找、删除联系人前置基础第6章元组与集合、第4-5章循环遍历、第3章if条件判断一、写在前面前面几章学了列表、元组和集合它们有一个共同特点只能存一列数据。比如[小明, 小红, 小刚]你知道第 0 个是小明但不知道这个小明的电话是多少、年龄多大。现实中我们经常需要存储配对的信息——姓名对应电话商品名对应价格学号对应成绩。这种一个键对应一个值的结构就是字典dict解决的问题。二、什么是字典字典是一种**键值对key-value**容器用大括号{}创建。每个数据由键和值组成中间用冒号分隔# 创建一个通讯录字典contact{name:小明,phone:13800138000,age:18}print(contact)# {name: 小明, phone: 13800138000, age: 18}字典的核心特点特点说明键唯一同一个字典中键不能重复重复赋值会覆盖键不可变键只能用 int / str / tuple 等不可变类型不能用列表无序Python 3.7保序Python 3.7 起字典保持插入顺序但概念上不依赖顺序查找快通过键查找值速度极快不受数据量影响# 键重复 → 后者覆盖前者d{name:小明,name:小红}print(d)# {name: 小红}# 键可以用数字scores{1:优秀,2:良好,3:及格}print(scores[1])# 优秀三、访问字典通过键取值3.1 中括号取值contact{name:小明,phone:13800138000,age:18}print(contact[name])# 小明print(contact[phone])# 13800138000和列表用索引数字取值不同字典用键取值。3.2 键不存在会报错print(contact[email])# ❌ KeyError: email3.3 get() 安全取值推荐用get()方法键不存在时返回None或指定的默认值不会报错contact{name:小明,phone:13800138000,age:18}print(contact.get(email))# Noneprint(contact.get(email,未填写))# 未填写print(contact.get(name))# 小明新手建议不确定键是否存在时一律用get()避免程序崩溃。四、增删改查4.1 添加新键赋值contact{name:小明,age:18}# 添加新键值对contact[phone]13800138000contact[email]xmqq.comprint(contact)# {name: 小明, age: 18, phone: 13800138000, email: xmqq.com}4.2 修改已有键重新赋值contact{name:小明,age:18}# 修改已有键的值contact[age]19print(contact)# {name: 小明, age: 19}添加和修改语法完全一样字典[键] 值。键不存在就添加键已存在就修改。4.3 删除del/pop()contact{name:小明,age:18,phone:13800138000}# del 删除指定键delcontact[phone]print(contact)# {name: 小明, age: 18}# pop() 删除并返回被删除的值removedcontact.pop(age)print(removed)# 18print(contact)# {name: 小明}4.4 清空clear()contact{name:小明,age:18}contact.clear()print(contact)# {}五、遍历字典字典有三种遍历方式根据需要选择5.1 遍历所有键keys()scores{语文:85,数学:90,英语:78}forkeyinscores.keys():print(key)运行结果语文 数学 英语5.2 遍历所有值values()forvalueinscores.values():print(value)运行结果85 90 785.3 遍历键值对items()最常用forkey,valueinscores.items():print(f{key}{value}分)运行结果语文85 分 数学90 分 英语78 分items()返回键值对元组用两个变量分别接收是最常用的遍历方式。5.4 检查键是否存在scores{语文:85,数学:90}print(语文inscores)# Trueprint(物理inscores)# Falseif物理inscores:print(scores[物理])else:print(没有物理成绩)六、嵌套字典字典的值可以是任何类型包括另一个字典。这就是嵌套字典# 通讯录每个人是一个字典contacts{小明:{phone:13800138000,age:18,city:北京},小红:{phone:13900139000,age:20,city:上海},}# 访问嵌套数据print(contacts[小明][phone])# 13800138000print(contacts[小红][city])# 上海# 遍历嵌套字典forname,infoincontacts.items():print(f{name}电话{info[phone]}{info[age]}岁{info[city]})运行结果小明电话1380013800018岁北京 小红电话1390013900020岁上海嵌套字典是组织结构化数据的常见方式后面做项目、处理 JSON 数据时经常用到。七、字典常用方法速查方法作用示例dict.get(key, default)安全取值键不存在返回默认值d.get(email, 无)dict.keys()返回所有键d.keys()dict.values()返回所有值d.values()dict.items()返回所有键值对d.items()dict.pop(key)删除键并返回值d.pop(age)dict.update(other)合并另一个字典d.update({city: 北京})dict.clear()清空字典d.clear()len(dict)返回键值对数量len(d)# update() 合并字典d1{name:小明,age:18}d2{age:19,city:北京}d1.update(d2)print(d1)# {name: 小明, age: 19, city: 北京}update()合并时如果键重复后者覆盖前者。八、Scratch 积木对照ScratchPython说明Scratch 列表只能存一列值字典{key: value}字典用键值对存储每个值都有名字标签# Scratch 列表只能存一列 → Python 字典存配对数据# Scratch: 列表 [小明, 小红, 小刚] ← 只有名字# Python: 字典可以存更多信息contacts{小明:18,小红:20,小刚:19}Scratch 的列表只能存一列数据比如一列名字想同时存名字和电话就很别扭。Python 字典用键值对解决这个问题——键是标签值是数据一一对应查找方便。可以把它想象成通讯录用名字查找电话。九、综合实战通讯录管理小程序综合运用字典的创建、增删改查、遍历、嵌套字典、条件判断# # 通讯录管理小程序# # 初始化通讯录嵌套字典contacts{小明:{phone:13800138000,age:18,city:北京},小红:{phone:13900139000,age:20,city:上海},}print(*40)print( 通讯录管理系统 v1.0)print(*40)whileTrue:print()print(1. 查看所有联系人)print(2. 查找联系人)print(3. 添加联系人)print(4. 删除联系人)print(5. 退出)print(-*30)choiceinput(请选择操作1-5)ifchoice1:# 遍历所有联系人iflen(contacts)0:print(通讯录为空)else:print(f\n共{len(contacts)}位联系人)forname,infoincontacts.items():print(f{name}|{info[phone]}|{info[age]}岁 |{info[city]})elifchoice2:# 查找联系人nameinput(请输入姓名)ifnameincontacts:infocontacts[name]print(f姓名{name})print(f电话{info[phone]})print(f年龄{info[age]})print(f城市{info[city]})else:print(f未找到联系人{name})elifchoice3:# 添加联系人nameinput(请输入姓名)ifnameincontacts:print(f联系人{name}已存在请勿重复添加)else:phoneinput(请输入电话)ageint(input(请输入年龄))cityinput(请输入城市)contacts[name]{phone:phone,age:age,city:city}print(f✅ 联系人{name}添加成功)elifchoice4:# 删除联系人nameinput(请输入要删除的姓名)ifnameincontacts:removedcontacts.pop(name)print(f✅ 已删除{name}电话{removed[phone]})else:print(f未找到联系人{name})elifchoice5:print(再见)breakelse:print(⚠️ 无效选择请输入 1-5)运行效果 通讯录管理系统 v1.0 1. 查看所有联系人 2. 查找联系人 3. 添加联系人 4. 删除联系人 5. 退出 ------------------------------ 请选择操作1-51 共 2 位联系人 小明 | 13800138000 | 18岁 | 北京 小红 | 13900139000 | 20岁 | 上海分步拆解嵌套字典存储每个联系人是一个字典包含phone/age/city三个字段外层字典以姓名为键查看所有items()遍历用f-string格式化输出查找in检查键是否存在存在则取出嵌套字典逐项输出添加先检查是否已存在避免覆盖不存在则创建新嵌套字典删除pop()删除并返回被删数据方便确认删除内容whileTrue循环让程序持续运行直到用户选择退出while循环第5章已学十、常见报错速查表报错信息出现场景原因解决方法KeyError: xxx字典取值用d[key]访问不存在的键改用d.get(key)或先用in检查TypeError: unhashable type: list字典创建用列表做键如{[1,2]: 值}键只能用不可变类型str/int/tupleAttributeError: dict object has no attribute xxx调用方法方法名拼写错误或不存在查阅字典方法表确认方法名ValueErrorpop()d.pop(不存在的键)pop传入默认值d.pop(键, None)十二、本章小结本章你掌握了 Python 字典的完整使用创建字典——大括号{}键值对用冒号分隔键唯一且不可变访问取值——d[key]直接取值键不存在会报错d.get(key)安全取值推荐增删改查——d[key] value添加或修改del d[key]/d.pop(key)删除遍历字典——keys()遍历键values()遍历值items()遍历键值对最常用嵌套字典——字典的值可以是另一个字典适合存储结构化数据字典是 Python 中最常用的数据结构之一后面做项目、处理 JSON、操作数据库返回结果时都会大量用到。往期回顾《Python 零基础入门从积木到代码》专栏序零基础学 Python 第1章 | 全平台装环境 VS Code 配置 第一个 Hello World零基础学 Python 第2章 | print 输出 变量赋值 input 交互输入零基础学 Python 第3章 | 条件判断if / elif / else零基础学 Python 第 4 章 | for 循环与 range()让程序帮你重复干活零基础学 Python 第 5 章 | while 循环与循环嵌套让程序看着条件自己干活零基础学 Python 第 6 章 | 元组与集合不可变数据与自动去重下一章预告前面学的列表、元组、集合、字典都是容器但数据里的文字本身也有很多操作技巧。下一章学习字符串的切片、常用方法和三种格式化输出把文本处理能力拉满。文末资源区资源说明Python 官方文档 - 字典https://docs.python.org/3/tutorial/datastructures.html#dictionariesPython 官方文档 -dict方法https://docs.python.org/3/library/stdtypes.html#mapping-types-dict本章完整源码chapter7_all.py关注梅雅达编程笔记评论领资料每节课都配套课后练习题与完整源码。代码报错、看不懂知识点可在评论区粘贴问题逐一解答欢迎关注梅雅达编程笔记持续分享Python零基础学习内容