零基础学 Python 第7章 | 字典 dict:键值对存储

本章摘要

  1. 核心目标:掌握字典的创建、增删改查、遍历与嵌套,能用键值对组织结构化数据
  2. 核心知识点:字典创建、通过键访问值、增/删/改、keys()/values()/items() 遍历、嵌套字典、get() 安全取值
  3. 实操产出:通讯录管理小程序,支持添加、查找、删除联系人
  4. 前置基础:第6章元组与集合、第4-5章循环遍历、第3章 if 条件判断

一、写在前面

前面几章学了列表、元组和集合,它们有一个共同特点:只能存一列数据 。比如 ["小明", "小红", "小刚"],你知道第 0 个是"小明",但不知道这个"小明"的电话是多少、年龄多大。

现实中我们经常需要存储配对的信息 ------姓名对应电话,商品名对应价格,学号对应成绩。这种"一个键对应一个值"的结构,就是字典(dict)解决的问题。


二、什么是字典

字典是一种**键值对(key-value)**容器,用大括号 {} 创建。每个数据由"键"和"值"组成,中间用冒号分隔:

python 复制代码
# 创建一个通讯录字典
contact = {"name": "小明", "phone": "13800138000", "age": 18}

print(contact)
# {'name': '小明', 'phone': '13800138000', 'age': 18}

字典的核心特点:

特点 说明
键唯一 同一个字典中键不能重复,重复赋值会覆盖
键不可变 键只能用 int / str / tuple 等不可变类型,不能用列表
无序(Python 3.7+保序) Python 3.7 起字典保持插入顺序,但概念上不依赖顺序
查找快 通过键查找值,速度极快,不受数据量影响
python 复制代码
# 键重复 → 后者覆盖前者
d = {"name": "小明", "name": "小红"}
print(d)   # {'name': '小红'}

# 键可以用数字
scores = {1: "优秀", 2: "良好", 3: "及格"}
print(scores[1])   # 优秀

三、访问字典:通过键取值

3.1 中括号取值

python 复制代码
contact = {"name": "小明", "phone": "13800138000", "age": 18}

print(contact["name"])    # 小明
print(contact["phone"])   # 13800138000

和列表用索引(数字)取值不同,字典用取值。

3.2 键不存在会报错

python 复制代码
print(contact["email"])   # ❌ KeyError: 'email'

3.3 get() 安全取值(推荐)

get() 方法,键不存在时返回 None(或指定的默认值),不会报错:

python 复制代码
contact = {"name": "小明", "phone": "13800138000", "age": 18}

print(contact.get("email"))           # None
print(contact.get("email", "未填写"))   # 未填写
print(contact.get("name"))            # 小明

新手建议:不确定键是否存在时,一律用 get(),避免程序崩溃。


四、增删改查

4.1 添加:新键赋值

python 复制代码
contact = {"name": "小明", "age": 18}

# 添加新键值对
contact["phone"] = "13800138000"
contact["email"] = "xm@qq.com"

print(contact)
# {'name': '小明', 'age': 18, 'phone': '13800138000', 'email': 'xm@qq.com'}

4.2 修改:已有键重新赋值

python 复制代码
contact = {"name": "小明", "age": 18}

# 修改已有键的值
contact["age"] = 19

print(contact)   # {'name': '小明', 'age': 19}

添加和修改语法完全一样:字典[键] = 值。键不存在就添加,键已存在就修改。

4.3 删除:del / pop()

python 复制代码
contact = {"name": "小明", "age": 18, "phone": "13800138000"}

# del 删除指定键
del contact["phone"]
print(contact)   # {'name': '小明', 'age': 18}

# pop() 删除并返回被删除的值
removed = contact.pop("age")
print(removed)    # 18
print(contact)    # {'name': '小明'}

4.4 清空:clear()

python 复制代码
contact = {"name": "小明", "age": 18}
contact.clear()
print(contact)   # {}

五、遍历字典

字典有三种遍历方式,根据需要选择:

5.1 遍历所有键:keys()

python 复制代码
scores = {"语文": 85, "数学": 90, "英语": 78}

for key in scores.keys():
    print(key)

运行结果:

复制代码
语文
数学
英语

5.2 遍历所有值:values()

python 复制代码
for value in scores.values():
    print(value)

运行结果:

复制代码
85
90
78

5.3 遍历键值对:items()(最常用)

python 复制代码
for key, value in scores.items():
    print(f"{key}:{value} 分")

运行结果:

复制代码
语文:85 分
数学:90 分
英语:78 分

items() 返回键值对元组,用两个变量分别接收,是最常用的遍历方式。

5.4 检查键是否存在

python 复制代码
scores = {"语文": 85, "数学": 90}

print("语文" in scores)      # True
print("物理" in scores)      # False

if "物理" in scores:
    print(scores["物理"])
else:
    print("没有物理成绩")

六、嵌套字典

字典的值可以是任何类型,包括另一个字典。这就是嵌套字典:

python 复制代码
# 通讯录:每个人是一个字典
contacts = {
    "小明": {"phone": "13800138000", "age": 18, "city": "北京"},
    "小红": {"phone": "13900139000", "age": 20, "city": "上海"},
}

# 访问嵌套数据
print(contacts["小明"]["phone"])    # 13800138000
print(contacts["小红"]["city"])     # 上海

# 遍历嵌套字典
for name, info in contacts.items():
    print(f"{name}:电话{info['phone']},{info['age']}岁,{info['city']}")

运行结果:

复制代码
小明:电话13800138000,18岁,北京
小红:电话13900139000,20岁,上海

嵌套字典是组织结构化数据的常见方式,后面做项目、处理 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)
python 复制代码
# update() 合并字典
d1 = {"name": "小明", "age": 18}
d2 = {"age": 19, "city": "北京"}
d1.update(d2)
print(d1)   # {'name': '小明', 'age': 19, 'city': '北京'}

update() 合并时,如果键重复,后者覆盖前者。


八、Scratch 积木对照

Scratch Python 说明
Scratch 列表(只能存一列值) 字典 {key: value} 字典用键值对存储,每个值都有名字标签
python 复制代码
# Scratch 列表只能存一列 → Python 字典存配对数据
# Scratch: 列表 [小明, 小红, 小刚]  ← 只有名字
# Python: 字典可以存更多信息
contacts = {"小明": 18, "小红": 20, "小刚": 19}

Scratch 的列表只能存一列数据(比如一列名字),想同时存名字和电话就很别扭。Python 字典用"键值对"解决这个问题------键是标签,值是数据,一一对应,查找方便。可以把它想象成通讯录:用名字查找电话。


九、综合实战:通讯录管理小程序

综合运用字典的创建、增删改查、遍历、嵌套字典、条件判断:

python 复制代码
# ========================================
# 通讯录管理小程序
# ========================================

# 初始化通讯录(嵌套字典)
contacts = {
    "小明": {"phone": "13800138000", "age": 18, "city": "北京"},
    "小红": {"phone": "13900139000", "age": 20, "city": "上海"},
}

print("=" * 40)
print("      通讯录管理系统 v1.0")
print("=" * 40)

while True:
    print()
    print("1. 查看所有联系人")
    print("2. 查找联系人")
    print("3. 添加联系人")
    print("4. 删除联系人")
    print("5. 退出")
    print("-" * 30)

    choice = input("请选择操作(1-5):")

    if choice == "1":
        # 遍历所有联系人
        if len(contacts) == 0:
            print("通讯录为空")
        else:
            print(f"\n共 {len(contacts)} 位联系人:")
            for name, info in contacts.items():
                print(f"  {name} | {info['phone']} | {info['age']}岁 | {info['city']}")

    elif choice == "2":
        # 查找联系人
        name = input("请输入姓名:")
        if name in contacts:
            info = contacts[name]
            print(f"姓名:{name}")
            print(f"电话:{info['phone']}")
            print(f"年龄:{info['age']}")
            print(f"城市:{info['city']}")
        else:
            print(f"未找到联系人:{name}")

    elif choice == "3":
        # 添加联系人
        name = input("请输入姓名:")
        if name in contacts:
            print(f"联系人 {name} 已存在,请勿重复添加")
        else:
            phone = input("请输入电话:")
            age = int(input("请输入年龄:"))
            city = input("请输入城市:")
            contacts[name] = {"phone": phone, "age": age, "city": city}
            print(f"✅ 联系人 {name} 添加成功")

    elif choice == "4":
        # 删除联系人
        name = input("请输入要删除的姓名:")
        if name in contacts:
            removed = contacts.pop(name)
            print(f"✅ 已删除:{name}(电话:{removed['phone']})")
        else:
            print(f"未找到联系人:{name}")

    elif choice == "5":
        print("再见!")
        break

    else:
        print("⚠️ 无效选择,请输入 1-5")

运行效果:

复制代码
========================================
      通讯录管理系统 v1.0
========================================

1. 查看所有联系人
2. 查找联系人
3. 添加联系人
4. 删除联系人
5. 退出
------------------------------
请选择操作(1-5):1

共 2 位联系人:
  小明 | 13800138000 | 18岁 | 北京
  小红 | 13900139000 | 20岁 | 上海

分步拆解:

  1. 嵌套字典存储 :每个联系人是一个字典,包含 phone/age/city 三个字段,外层字典以姓名为键
  2. 查看所有items() 遍历,用 f-string 格式化输出
  3. 查找in 检查键是否存在,存在则取出嵌套字典逐项输出
  4. 添加:先检查是否已存在,避免覆盖;不存在则创建新嵌套字典
  5. 删除pop() 删除并返回被删数据,方便确认删除内容
  6. while True 循环 :让程序持续运行直到用户选择退出(while 循环第5章已学)

十、常见报错速查表

报错信息 出现场景 原因 解决方法
KeyError: 'xxx' 字典取值 d[key] 访问不存在的键 改用 d.get(key) 或先用 in 检查
TypeError: unhashable type: 'list' 字典创建 用列表做键,如 {[1,2]: "值"} 键只能用不可变类型(str/int/tuple
AttributeError: 'dict' object has no attribute 'xxx' 调用方法 方法名拼写错误或不存在 查阅字典方法表,确认方法名
ValueError pop() d.pop("不存在的键") pop 传入默认值:d.pop("键", None)

十二、本章小结

本章你掌握了 Python 字典的完整使用:

  1. 创建字典 ------大括号 {},键值对用冒号分隔,键唯一且不可变
  2. 访问取值 ------d[key] 直接取值(键不存在会报错),d.get(key) 安全取值(推荐)
  3. 增删改查 ------d[key] = value 添加或修改,del d[key] / d.pop(key) 删除
  4. 遍历字典 ------keys() 遍历键,values() 遍历值,items() 遍历键值对(最常用)
  5. 嵌套字典------字典的值可以是另一个字典,适合存储结构化数据

字典是 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#dictionaries
Python 官方文档 - dict 方法 https://docs.python.org/3/library/stdtypes.html#mapping-types-dict
本章完整源码 chapter7_all.py(关注梅雅达编程笔记,评论领资料)

每节课都配套课后练习题与完整源码。代码报错、看不懂知识点,可在评论区粘贴问题,逐一解答!

欢迎关注梅雅达编程笔记,持续分享Python零基础学习内容

相关推荐
heroboyluck2 小时前
AI工程师第四课 - 深度学习入门
人工智能·python·深度学习·llama
灯澜忆梦2 小时前
GO---map函数
开发语言·前端·后端·golang
alicema11112 小时前
BRAIN 研究顾问(Research Consultant)兼职
python·量化
元Y亨H2 小时前
Python,单引号和双引号有何区别
python
超神熊猫2 小时前
🧀🧀🧀前端仔如何快速上手python
前端·python
卷无止境2 小时前
Flet 完全教程:用纯 Python 构建跨平台应用
前端·python
北冥you鱼2 小时前
Go语言与默克尔树:区块链数据完整性的基石
开发语言·golang·区块链
量化吞吐机3 小时前
2026年AI量化工具评估,先分开学习开发和验证
人工智能·python
库克克3 小时前
【C++】类和对象--this指针详解
java·开发语言·c++