📖 08. 字典 dict 详解
本章概述
学习 Python 字典的定义、操作和常用方法。 预计学习时间:50 分钟
8.1 字典定义
字典是键值对的集合,无序(Python 3.7+有序),key必须唯一且不可变。
# 空字典
d = {}
d = dict()
# 有数据的字典
d = {"name": "Tom", "age": 18, "gender": "男"}
# key可以是不同的不可变类型
d = {1: "one", "two": 2, (1,2): "tuple"}字典特点
- ✅ 键值对存储(key-value)
- ✅ key 必须唯一(重复会覆盖)
- ✅ key 必须是不可变类型(字符串、数字、元组)
- ✅ value 可以是任意类型
- ✅ 查询速度非常快(O(1),哈希表实现)
- ⚠️ Python 3.7+ 有序,之前版本无序
8.2 字典的增删改查
查
d = {"name": "Tom", "age": 18}
# 方式1:[] 取值(key不存在会报错)
d["name"] # 'Tom'
# d["height"] # ❌ KeyError
# 方式2:get() 取值(key不存在返回None或默认值)
d.get("age") # 18
d.get("height") # None(不报错)
d.get("height", 0) # 0(指定默认值)
# 方式3:setdefault() 取值(key不存在就添加)
d.setdefault("age", 20) # 18(key存在,返回原值)
d.setdefault("height", 175) # 175(key不存在,添加并返回)
print(d) # {'name': 'Tom', 'age': 18, 'height': 175}推荐用 get()
取值时推荐用
get(),避免 key 不存在时报错。
增/改
d = {"name": "Tom"}
# key存在就是修改,不存在就是新增
d["age"] = 18 # 新增
d["name"] = "Jerry" # 修改
print(d) # {'name': 'Jerry', 'age': 18}
# update:批量添加/修改
d.update({"gender": "男", "age": 20})
print(d) # {'name': 'Jerry', 'age': 20, 'gender': '男'}删
d = {"name": "Tom", "age": 18, "gender": "男"}
# pop:删除指定key并返回value
d.pop("age") # 18
print(d) # {'name': 'Tom', 'gender': '男'}
# popitem:删除最后一个键值对并返回(Python 3.7+)
d.popitem() # ('gender', '男')
print(d) # {'name': 'Tom'}
# del:删除指定key
del d["name"]
# clear:清空字典
d.clear()
print(d) # {}8.3 字典方法大全
🔑 keys / values / items
d = {"name": "Tom", "age": 18}
# 获取所有key
d.keys() # dict_keys(['name', 'age'])
list(d.keys()) # ['name', 'age']
# 获取所有value
d.values() # dict_values(['Tom', 18])
# 获取所有键值对
d.items() # dict_items([('name', 'Tom'), ('age', 18)])遍历字典
遍历键值对用
items()最方便:for key, value in d.items(): print(key, value)
📋 复制
d = {"a": 1, "b": 2}
# copy:浅拷贝
d2 = d.copy()
# dict() 构造
d3 = dict(d)🔍 判断
d = {"name": "Tom", "age": 18}
# 判断key是否存在
"name" in d # True
"height" in d # False
# 长度
len(d) # 2注意
in判断的是 key,不是 value!d = {"name": "Tom"} "Tom" in d # False(判断的是key) "name" in d # True
8.4 字典遍历
d = {"name": "Tom", "age": 18, "gender": "男"}
# 遍历key
for key in d:
print(key, d[key])
# 遍历key(更明确)
for key in d.keys():
print(key)
# 遍历value
for value in d.values():
print(value)
# 遍历键值对(最常用)
for key, value in d.items():
print(key, value)8.5 字典推导式
Python 特色
和列表推导式类似,字典也有推导式。
基本格式
{key: value for 变量 in 可迭代对象}
{key: value for 变量 in 可迭代对象 if 条件}
示例
# 字典推导式
squares = {x: x**2 for x in range(5)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# 带条件
even_squares = {x: x**2 for x in range(10) if x % 2 == 0}
# {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}
# 键值互换
d = {"a": 1, "b": 2, "c": 3}
new_d = {v: k for k, v in d.items()}
# {1: 'a', 2: 'b', 3: 'c'}
# 两个列表合成字典
keys = ["a", "b", "c"]
values = [1, 2, 3]
d = {k: v for k, v in zip(keys, values)}
# {'a': 1, 'b': 2, 'c': 3}8.6 其他创建字典的方式
# 方式1:{}
d1 = {"name": "Tom", "age": 18}
# 方式2:dict() 关键字参数
d2 = dict(name="Tom", age=18)
# 方式3:dict() 二元组列表
d3 = dict([("name", "Tom"), ("age", 18)])
# 方式4:dict.fromkeys() 批量创建(value相同)
d4 = dict.fromkeys(["a", "b", "c"], 0)
# {'a': 0, 'b': 0, 'c': 0}
# 方式5:zip() 两个列表
keys = ["a", "b", "c"]
values = [1, 2, 3]
d5 = dict(zip(keys, values))8.7 嵌套字典
# 字典套字典
students = {
"001": {"name": "张三", "age": 18, "score": 90},
"002": {"name": "李四", "age": 19, "score": 85},
"003": {"name": "王五", "age": 18, "score": 95}
}
# 取值
students["001"]["name"] # '张三'
students["002"]["score"] # 85
# 遍历
for id, info in students.items():
print(f"学号{id}:{info['name']},{info['age']}岁")8.8 字典的常见坑
key 必须是不可变类型
列表不能当字典的 key!
d = {[1, 2]: "value"} # ❌ 报错 TypeError d = {(1, 2): "value"} # ✅ 元组可以
key 重复会覆盖
d = {"a": 1, "a": 2} print(d) # {'a': 2}(后面的覆盖前面的)
更多坑点见 易错点汇总 - 数据类型
🔗 相关章节
📝 我的笔记
在这里记录你的理解、疑问和练习代码
# 你的练习代码
✅ 本章检查清单
- 掌握字典的定义和特点
- 掌握字典的增删改查操作
- 会使用 keys/values/items 方法
- 会遍历字典
- 理解字典推导式
- 了解字典的常见坑点