📖 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 方法
  • 会遍历字典
  • 理解字典推导式
  • 了解字典的常见坑点