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 模块中的高级字典类型。
相关推荐
lucas_AI1 小时前
SFT 之后再涨 54%:OPPO 给文档 OCR 装了个「错题本」,自博弈三轮把 CER 从 2.40 打到 1.11
人工智能
知行产研1 小时前
湖州样板+团体标准,伯镭科技引领水泥矿山无人化
人工智能·科技·1024程序员节
小白今天也很酷1 小时前
MCXN947更新板载DAP_Link固件的方法
c语言·python·单片机·ubuntu·excel·1024程序员节
攻城狮Soar1 小时前
详解volatile
开发语言·c++·1024程序员节
小羊没烦恼!1 小时前
.NET无侵入自动化探针原理和主流实现
运维·开发语言·javascript·python·自动化·.net·1024程序员节
全栈探索者1 小时前
模型去哪下、放哪里、怎么选:Mac 玩 ComfyUI 的模型管理全图景(附我的实盘清单)
人工智能·macos·aigc·stablediffusion·comfyui
天远Date Lab1 小时前
零信任架构实战:基于天远车型识别普通构建自动化二手车认证参数建档网关
人工智能·1024程序员节
立康科普1 小时前
含多肽钙的补钙产品是什么?和普通钙片有什么区别?
python·1024程序员节
天远数科1 小时前
零信任架构实战:基于天远车型识别普通构建自动化汽车消费信贷车辆精细款型校验网关
人工智能·1024程序员节·工具分享