Python 菜鸟入门:字典(dict)类型详解与 CRUD 实战案例

1. 什么是字典

字典(dict)是 Python 中最常用的内置数据类型之一,用来存储**键值对(key-value)**数据。

它的特点:

  • 用大括号 {} 表示,元素形式为 key: value
  • 键(key)必须是不可变类型,如字符串、数字、元组
  • 键在同一个字典中唯一,重复赋值会覆盖旧值
  • Python 3.7+ 中字典保持插入顺序
  • 查找、插入、删除的平均时间复杂度都是 O(1)

一句话理解:字典就像一本真正的字典,通过「词条(key)」快速查到「解释(value)」。

python 复制代码
# 一个最简单的字典
student = {
    "name": "小明",
    "age": 18,
    "score": 92.5
}

print(student)
print(type(student))

输出:

text 复制代码
{'name': '小明', 'age': 18, 'score': 92.5}
<class 'dict'>

2. 字典的创建方式

创建字典有多种写法,菜鸟阶段掌握前三种即可。

python 复制代码
# 方式一:字面量
d1 = {"a": 1, "b": 2}

# 方式二:dict() 构造函数 + 关键字参数
d2 = dict(name="小明", age=18)

# 方式三:由可迭代的键值对序列创建
d3 = dict([("a", 1), ("b", 2)])

# 方式四:zip 打包两个列表
keys = ["name", "age"]
values = ["小明", 18]
d4 = dict(zip(keys, values))

# 方式五:字典推导式
d5 = {x: x * x for x in range(1, 5)}

# 空字典
empty = {}
empty2 = dict()

print(d1, d2, d3, d4, d5, empty, empty2, sep="\n")

输出:

text 复制代码
{'a': 1, 'b': 2}
{'name': '小明', 'age': 18}
{'a': 1, 'b': 2}
{'name': '小明', 'age': 18}
{1: 1, 2: 4, 3: 9, 4: 16}
{}
{}

3. 字典的 CRUD 操作

CRUD 分别指 Create(增)、Read(查)、Update(改)、Delete(删)。下面用一个「学生信息管理」的小案例贯穿讲解。

3.1 Create:新增键值对

直接通过 字典[新键] = 值 即可新增;也可以用 setdefault(),键不存在时才写入。

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

# 直接赋值新增
student["score"] = 92.5
student["city"] = "杭州"
print(student)

# setdefault:键不存在才新增,已存在则返回原值
student.setdefault("gender", "男")
student.setdefault("age", 20)   # age 已存在,不会被覆盖
print(student)

输出:

text 复制代码
{'name': '小明', 'age': 18, 'score': 92.5, 'city': '杭州'}
{'name': '小明', 'age': 18, 'score': 92.5, 'city': '杭州', 'gender': '男'}

3.2 Read:查询键值对

查询是最常用的操作,注意「键不存在」时的两种处理方式。

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

# 方式一:[] 取值,键不存在会抛 KeyError
print(student["name"])

# 方式二:get() 取值,键不存在返回 None 或指定默认值(推荐)
print(student.get("age"))
print(student.get("city"))          # None
print(student.get("city", "未知"))   # 未知

# 判断键是否存在
print("score" in student)   # True
print("city" in student)    # False

# 遍历字典
for key in student:
    print(key, "=", student[key])

for key, value in student.items():
    print(f"{key}: {value}")

输出:

text 复制代码
小明
18
None
未知
True
False
name = 小明
age = 18
score = 92.5
name: 小明
age: 18
score: 92.5

3.3 Update:修改键值对

键已存在时直接赋值就是修改;批量修改可用 update()。

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

# 单个修改
student["age"] = 19
print(student)

# 批量修改 / 合并另一个字典
student.update({"score": 95, "city": "杭州"})
print(student)

输出:

text 复制代码
{'name': '小明', 'age': 19, 'score': 92.5}
{'name': '小明', 'age': 19, 'score': 95, 'city': '杭州'}

3.4 Delete:删除键值对

删除有四种常用方式,区别在于「键不存在时」的表现。

python 复制代码
student = {"name": "小明", "age": 18, "score": 92.5, "city": "杭州"}

# 方式一:del,键不存在会抛 KeyError
del student["city"]
print(student)

# 方式二:pop(),删除并返回该值,可给默认值避免报错
score = student.pop("score")
print("删除的分数:", score)
print(student)

# 方式三:popitem(),删除并返回最后一个键值对(Python 3.7+)
item = student.popitem()
print("删除的键值对:", item)
print(student)

# 方式四:clear(),清空整个字典
student.clear()
print(student)

输出:

text 复制代码
{'name': '小明', 'age': 18, 'score': 92.5}
删除的分数: 92.5
{'name': '小明', 'age': 18}
删除的键值对: ('age', 18)
{'name': '小明'}
{}

4. 完整实战案例:学生信息管理

把上面的 CRUD 组合起来,写一个可以循环操作的小程序。

python 复制代码
def main():
    students = {}   # key: 学号, value: 学生信息字典

    while True:
        print("\n===== 学生信息管理 =====")
        print("1. 新增学生")
        print("2. 查询学生")
        print("3. 修改学生")
        print("4. 删除学生")
        print("5. 查看全部")
        print("0. 退出")

        choice = input("请选择操作:").strip()

        if choice == "1":
            sid = input("学号:").strip()
            if sid in students:
                print("该学号已存在!")
                continue
            name = input("姓名:").strip()
            age = int(input("年龄:").strip())
            students[sid] = {"name": name, "age": age}
            print("新增成功")

        elif choice == "2":
            sid = input("学号:").strip()
            info = students.get(sid)
            if info:
                print(f"学号 {sid}:姓名 {info['name']},年龄 {info['age']}")
            else:
                print("未找到该学生")

        elif choice == "3":
            sid = input("学号:").strip()
            if sid not in students:
                print("未找到该学生")
                continue
            name = input("新姓名(回车跳过):").strip()
            age = input("新年龄(回车跳过):").strip()
            if name:
                students[sid]["name"] = name
            if age:
                students[sid]["age"] = int(age)
            print("修改成功")

        elif choice == "4":
            sid = input("学号:").strip()
            removed = students.pop(sid, None)
            print("删除成功" if removed else "未找到该学生")

        elif choice == "5":
            if not students:
                print("暂无数据")
            for sid, info in students.items():
                print(f"{sid} -> {info}")

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

        else:
            print("无效选项,请重新输入")


if __name__ == "__main__":
    main()

运行效果示例:

text 复制代码
===== 学生信息管理 =====
1. 新增学生
2. 查询学生
3. 修改学生
4. 删除学生
5. 查看全部
0. 退出
请选择操作:1
学号:1001
姓名:小明
年龄:18
新增成功

5. 常用方法速查表

方法 作用 键不存在时
d[key] 取值 抛 KeyError
d.get(key, default) 取值 返回 default
d[key] = value 新增或修改 新增
d.setdefault(key, default) 键不存在时写入 写入并返回 default
d.update(other) 批量更新 新增缺失键
del d[key] 删除 抛 KeyError
d.pop(key, default) 删除并返回值 返回 default
d.popitem() 删除最后一个键值对 空字典抛 KeyError
d.clear() 清空 ---
d.keys() / d.values() / d.items() 获取键 / 值 / 键值对视图 ---

6. 新手常见坑

  1. 用 [] 取不存在的键 :会直接报 KeyError,查询时优先用 get()。
  2. 把列表当键 :{[1, 2]: "x"} 会报 TypeError,因为列表不可哈希;需要时改用元组。
  3. 遍历时修改字典 :for k in d: del d[k] 会报 RuntimeError,应先复制一份 for k in list(d):。
  4. 误以为 keys() 返回列表 :它返回的是视图对象,需要列表时用 list(d.keys())。
  5. update() 会覆盖同名键:合并字典时注意键冲突。

7. 小结

  • 字典用 {} 存储键值对,键唯一且必须可哈希。
  • CRUD 四件套:d[k] = v 增改、d.get(k) 查、d.update() 批量改、del / pop() 删。
  • 查询优先用 get(),删除优先用 pop(key, default),能有效避免异常。
  • 掌握字典后,可以继续学习 defaultdict、Counter 等 collections 模块中的高级字典类型。
相关推荐
深圳雨林凯AI3 分钟前
商品详情长图的自动生成:版块模板、要素抽取与版式约束的实现思路
人工智能·ai
lisw056 分钟前
迁移学习(Transfer Learning):概念、历史、内容、挑战与展望
人工智能·机器学习·迁移学习
炫酷的大高个16 分钟前
98% 连跑 20 次只剩 67%,我算了大模型重试账
人工智能·架构·开源
可乐ea22 分钟前
智能体的模型列表为什么要从三处来源合成:一次让 GPT-6.1 Sol 选不上的发布延迟
人工智能·gpt·chatgpt·智能体框架·模型列表·多源数据合成·客户端工程
freewebsys29 分钟前
【原始POSTMAN】最老一个版本的postman 大家还记得吗?官方已经不支持没有升级了,下载了组件用AI直接升级了下可以使用了!
人工智能
总要学点什么37 分钟前
第105篇:三维特效-流动图片墙体效果——让箭头沿墙长滚,它俩竟是同一份代码
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
云南新人和数采集团40 分钟前
云南靠谱软件开发公司选型指南:以昆明新腾科技为例
大数据·人工智能·科技
xiaoye-duck1 小时前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型
2601_967979121 小时前
Python第七十四讲 异常处理完全精通 try-except零基础保姆级教程
python·异常处理·编程教程·错误处理·try-except
发现你走远了1 小时前
05-权限不是开关:工具调用如何在放行、拦截与追问之间做决定
人工智能·agent·claude