Python 字典

字典是Python中最强大的数据类型之一,它就像一本真正的字典一样,每个"单词"(键)对应一个"解释"(值)。字典就像你手机里的通讯录,每个名字(键)对应一个电话号码(值)。

字典的核心概念

字典由键(key)-值(value)对组成:

  • 键(key): 必须是不可变类型(字符串、数字、元组)
  • 值(value): 可以是任何Python对象
  • 字典中的键是唯一的,值可以重复
  • 字典是无序的(Python 3.6+开始有序)
姓名
"小明"
年龄
12
爱好
["看书", "编程", "踢足球"]
成绩
{"语文":95, "数学":98, "英语":92}

创建字典

创建字典有多种方式:

# 方法1: 使用花括号 {}
student = {
    "姓名": "小明",
    "年龄": 12,
    "年级": 6
}

# 方法2: 使用 dict() 函数
student = dict(姓名="小明", 年龄=12, 年级=6)

# 方法3: 列表转字典(使用 zip())
keys = ["姓名", "年龄", "年级"]
values = ["小明", 12, 6]
student = dict(zip(keys, values))

# 创建空字典
empty_dict = {}
# 或
empty_dict = dict()
重要注意事项
  • 字典的键必须是不可变类型(不能使用列表作为键)
  • 键在字典中是唯一的,如果重复,后面的值会覆盖前面的
  • 字典的值可以是任何类型 - 数字、字符串、列表、甚至另一个字典!

访问字典元素

通过键来访问字典中的值:

student = {
    "姓名": "小明",
    "年龄": 12,
    "年级": 6
}

# 方法1: 使用方括号 []
name = student["姓名"] # "小明"

# 方法2: 使用 get() 方法(更安全)
age = student.get("年龄") # 12

# 访问不存在的键
# height = student["身高"] # 会报错 KeyError
height = student.get("身高") # 返回 None
height = student.get("身高", 150) # 设置默认值 150

# 检查键是否存在
if "年级" in student:
    print("年级信息存在")

添加和修改元素

添加新键值对

直接赋值给新键

student["身高"] = 155

修改值

重新赋值给已有键

student["年龄"] = 13

更新字典

使用update()方法

student.update({"爱好":"编程"})
student = {"姓名": "小明", "年龄": 12}

# 添加新元素
student["年级"] = 6
student["爱好"] = ["编程", "足球"]

# 修改元素
student["年龄"] = 13 # 修改年龄

# 使用 update() 添加多个元素
student.update({
    "身高": 155,
    "体重": 45
})

print(student)
# 输出: {'姓名': '小明', '年龄': 13, '年级': 6, '爱好': ['编程', '足球'], '身高': 155, '体重': 45}

删除元素

del 关键字

删除指定的键值对

del student["体重"]

pop() 方法

删除并返回指定键的值

age = student.pop("年龄")

clear() 方法

清空整个字典

student.clear()
student = {"姓名": "小明", "年龄": 13, "年级": 6}

# 删除指定的键值对
del student["年龄"]

# 使用 pop() 删除并获取值
grade = student.pop("年级")
print(f"年级: {grade}") # 输出: 年级: 6

# popitem() 删除最后一个键值对(Python 3.7+)
last_item = student.popitem()
print(last_item) # 输出: ('姓名', '小明')

# 清空字典
student.clear()
print(student) # 输出: {}

遍历字典

遍历字典有多种方式:

student = {
    "姓名": "小明",
    "年龄": 13,
    "年级": 6,
    "爱好": ["编程", "足球"]
}

# 遍历所有键
print("键:")
for key in student:
    print(key)

# 遍历所有值
print("\n值:")
for value in student.values():
    print(value)

# 同时遍历键和值
print("\n键和值:")
for key, value in student.items():
    print(f"{key}: {value}")

# 遍历键的另一种方式
for key in student.keys():
    print(key)

字典方法

Python字典提供了许多有用的方法:

copy()

创建字典的浅拷贝

new_dict = old_dict.copy()

keys()

返回字典所有键

keys = student.keys()

values()

返回字典所有值

values = student.values()

items()

返回键值对元组

items = student.items()

setdefault()

安全获取值,如不存在则设置默认值

value = student.setdefault("身高", 150)

update()

合并两个字典

student.update(new_info)
实际应用示例
示例1:学生管理系统
students = {
    "001": {"姓名": "小明", "年龄": 12, "成绩": {"语文":90, "数学":95}},
    "002": {"姓名": "小红", "年龄": 11, "成绩": {"语文":95, "数学":92}}
}

# 添加新学生
students["003"] = {
    "姓名": "小刚",
    "年龄": 13,
    "成绩": {"语文":88, "数学":90}
}

# 修改学生成绩
students["001"]["成绩"]["数学"] = 98

# 计算平均分
def calculate_average(student_id):
    scores = students[student_id]["成绩"].values()
    return sum(scores) / len(scores)

# 打印所有学生信息
for student_id, info in students.items():
    avg = calculate_average(student_id)
    print(f"学号: {student_id}, 姓名: {info['姓名']}, 平均分: {avg:.1f}")
示例2:游戏角色属性
# 游戏角色属性
character = {
    "name": "勇敢战士",
    "level": 5,
    "health": 100,
    "attack": 25,
    "defense": 15,
    "skills": ["劈砍", "格挡", "冲锋"]
}

# 升级角色
def level_up(char):
    char["level"] += 1
    char["health"] += 20
    char["attack"] += 5
    char["defense"] += 3
    print(f"{char['name']}升级到{char['level']}级!")

# 学习新技能
def learn_skill(char, skill):
    if skill not in char["skills"]:
        char["skills"].append(skill)
        print(f"{char['name']}学会了新技能: {skill}")
    else:
        print(f"{char['name']}已经会技能: {skill}")

# 使用角色
level_up(character)
learn_skill(character, "旋风斩")
learn_skill(character, "格挡") # 重复技能

print("\n角色最终属性:")
for key, value in character.items():
    print(f"{key}: {value}")

字典 vs 列表

特性 字典 列表
访问方式 通过键访问 通过索引访问
存储内容 键值对 有序元素序列
元素顺序 Python 3.7+ 有序 有序
查找速度 非常快(基于哈希) 较慢(需要遍历)
索引访问 不支持数字索引 支持
使用场景 有逻辑关联的数据 有序数据序列
语法 {key: value} [item1, item2]

字典练习

尝试解决这些练习来巩固你的字典知识:

编程挑战

练习1:单词计数器

编写一个程序,统计一段文本中每个单词出现的次数

  • 将文本分解为单词列表
  • 使用字典存储每个单词的出现次数
  • 输出每个单词及其出现次数

示例文本:"苹果 香蕉 苹果 橙子 香蕉 苹果"

输出: 苹果: 3 香蕉: 2 橙子: 1

练习2:学生成绩管理

创建一个学生成绩管理系统:

  • 存储学生姓名和成绩(语文、数学、英语)
  • 能够添加、删除、修改学生信息
  • 计算每个学生的平均分
  • 找出平均分最高的学生

练习3:电话簿

创建一个简单的电话簿程序:

  • 添加联系人(姓名、电话)
  • 查找联系人电话
  • 删除联系人
  • 显示所有联系人

练习4:词汇翻译器

创建一个中英文单词翻译器:

  • 存储中英文单词对应关系
  • 用户输入中文单词,输出英文翻译
  • 用户输入英文单词,输出中文翻译
  • 能够添加新的单词翻译

总结

关键知识点回顾

✓ 字典特性: 键值对、键唯一、键不可变、无序(Python 3.7+有序)

✓ 创建字典: {}, dict(), dict(zip(keys, values))

✓ 访问元素: dict[key], dict.get(key, default)

✓ 修改添加: dict[key] = value, update()

✓ 删除元素: del, pop(), popitem(), clear()

✓ 遍历字典: keys(), values(), items()

✓ 常用方法: copy(), setdefault()

✓ 使用场景: 关联数据、快速查找、配置信息

字典小测验

看看你是否掌握了这些知识:

  1. 字典的键有什么限制?
  2. 如何安全地获取字典值(避免KeyError)?
  3. 如何同时遍历字典的键和值?
  4. 字典和列表在访问元素方面有什么区别?
  5. update()方法有什么作用?