字典(Dictionary)

学习Python字典的创建、访问和常用操作,掌握这个按键值对存储和管理数据的强大工具。

基本概念

字典是Python中一种非常重要的数据结构,它以键值对(key-value)的形式存储数据。字典中的每个元素都由一个键(key)和一个值(value)组成,通过键可以快速访问对应的值。

字典的特点:

  • 无序:Python 3.7之前字典是无序的,Python 3.7及以后字典保持插入顺序
  • 可变:可以修改、添加、删除字典中的键值对
  • 键唯一:每个键在字典中只能出现一次,值可以重复
  • 键必须是不可变类型:可以是字符串、数字、元组等,不能是列表、字典等可变类型
  • 值可以是任意类型:可以是数字、字符串、列表、字典等

字典的表示:用花括号 {} 包围键值对,键和值之间用冒号 : 分隔,多个键值对之间用逗号 , 分隔。

# 创建一个空字典
empty_dict = {}
# 或者使用dict()函数
empty_dict = dict()

# 创建一个包含键值对的字典
student = {
    'name': '小明',
    'age': 15,
    'gender': '男',
    'grades': [85, 92, 78]
}

# 使用dict()函数创建字典
person = dict(name='小红', age=14, gender='女')

# 使用键值对列表创建字典
items = [('color', 'red'), ('size', 'medium'), ('price', 19.99)]
product = dict(items)

访问字典元素

访问字典中的元素主要通过键来获取对应的值,也可以使用一些内置方法来访问所有的键、所有的值或所有的键值对。

# 创建一个字典
student = {
    'name': '小明',
    'age': 15,
    'gender': '男',
    'grades': [85, 92, 78]
}

# 通过键访问值
print(student['name']) # 输出: 小明
print(student['age']) # 输出: 15

# 尝试访问不存在的键(会引发错误)
# print(student['score']) # KeyError: 'score'

# 使用get()方法安全地访问值,不存在则返回默认值
print(student.get('score', 0)) # 输出: 0
print(student.get('name', '未知')) # 输出: 小明

# 获取所有键
print(student.keys()) # 输出类似: dict_keys(['name', 'age', 'gender', 'grades'])
print(list(student.keys())) # 转换为列表: ['name', 'age', 'gender', 'grades']

# 获取所有值
print(student.values()) # 输出类似: dict_values(['小明', 15, '男', [85, 92, 78]])
print(list(student.values())) # 转换为列表: ['小明', 15, '男', [85, 92, 78]]

# 获取所有键值对
print(student.items()) # 输出类似: dict_items([('name', '小明'), ('age', 15), ('gender', '男'), ('grades', [85, 92, 78])])
print(list(student.items())) # 转换为列表: [('name', '小明'), ('age', 15), ('gender', '男'), ('grades', [85, 92, 78])]

我们还可以使用 in 关键字来检查某个键是否在字典中:

# 检查键是否在字典中
if 'name' in student:
    print("字典中包含name键")
else:
    print("字典中不包含name键")

if 'score' not in student:
    print("字典中不包含score键")

修改字典

字典是可变的,我们可以添加、更新和删除字典中的键值对。

# 创建一个字典
student = {
    'name': '小明',
    'age': 15,
    'gender': '男'
}
print("原始字典: ", student)

# 添加新的键值对
student['grades'] = [85, 92, 78]
student['class'] = '初一(1)班'
print("添加键值对后: ", student)

# 更新已有键的值
student['age'] = 16
student['grades'] = [90, 95, 85]
print("更新后: ", student)

# 使用update()方法添加/更新多个键值对
student.update({
    'height': 170,
    'weight': 55,
    'name': '小明同学' # 更新已有键
})
print("使用update()后: ", student)

# 使用del语句删除键值对
del student['weight']
print("删除weight后: ", student)

# 使用pop()方法删除指定键,并返回对应的值
class_value = student.pop('class')
print("删除的class值: ", class_value)
print("删除class后: ", student)

# 尝试删除不存在的键(会引发错误)
# del student['score'] # KeyError: 'score'

# 使用pop()方法安全地删除可能不存在的键
score_value = student.pop('score', None) # 如果不存在,返回None
print("score值: ", score_value)

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

字典常用方法

Python字典提供了许多有用的方法,可以帮助我们更方便地操作字典。

clear()

清空字典中的所有键值对

copy()

创建字典的浅拷贝

fromkeys()

创建一个新字典,以序列中的元素作为键

get()

返回指定键的值,如果键不存在则返回默认值

items()

返回字典中所有键值对的视图

keys()

返回字典中所有键的视图

values()

返回字典中所有值的视图

pop()

删除指定键并返回对应的值

popitem()

删除并返回最后插入的键值对

setdefault()

如果键存在则返回值,如果不存在则插入键和默认值

update()

使用另一个字典或键值对序列更新字典

# 创建一个字典
student = {
    'name': '小明',
    'age': 15,
    'grades': {'math': 85, 'english': 92, 'chinese': 78}
}

# copy()方法创建浅拷贝
student_copy = student.copy()
print("拷贝的字典: ", student_copy)

# fromkeys()方法创建新字典
keys = ['a', 'b', 'c']
default_dict = dict.fromkeys(keys, 0)
print("fromkeys创建的字典: ", default_dict) # 输出: {'a': 0, 'b': 0, 'c': 0}

# popitem()方法删除并返回最后插入的键值对
last_item = student.popitem()
print("删除的键值对: ", last_item) # 输出类似: ('grades', {'math': 85, 'english': 92, 'chinese': 78})
print("删除后: ", student) # 输出: {'name': '小明', 'age': 15}

# setdefault()方法
gender = student.setdefault('gender', '男') # 键不存在,添加并返回默认值
print("gender值: ", gender)
print("添加gender后: ", student)

name = student.setdefault('name', '未知') # 键存在,返回已有值
print("name值: ", name)

遍历字典

我们可以使用循环来遍历字典中的键、值或键值对。

# 创建一个字典
student = {
    'name': '小明',
    'age': 15,
    'gender': '男',
    'grades': {'math': 85, 'english': 92, 'chinese': 78}
}

# 遍历字典的键
print("字典的键: ")
for key in student:
    print(key)

# 或者明确使用keys()方法
for key in student.keys():
    print(key)

# 遍历字典的值
print("\n字典的值: ")
for value in student.values():
    print(value)

# 遍历字典的键值对
print("\n字典的键值对: ")
for key, value in student.items():
    print(f"{key}: {value}")

# 遍历嵌套字典
print("\n成绩详情: ")
for subject, score in student['grades'].items():
    print(f"{subject}: {score}")

故事化案例:学生信息管理

班级需要管理学生的信息,包括姓名、年龄、性别、成绩等。让我们用Python字典来帮助老师管理这些信息。

场景:班级学生信息管理

  • 创建多个学生的信息字典
  • 将学生字典存储在一个班级字典中
  • 添加和删除学生
  • 更新学生信息
  • 查询特定学生信息
  • 计算各科平均分和最高分

代码实现:

# 创建一个班级字典,存储多个学生的信息
class_info = {
    'class_name': '初一(1)班',
    'teacher': '张老师',
    'students': {
        's001': {
            'name': '小明',
            'age': 15,
            'gender': '男',
            'grades': {'math': 85, 'english': 92, 'chinese': 78}
        },
        's002': {
            'name': '小红',
            'age': 14,
            'gender': '女',
            'grades': {'math': 90, 'english': 88, 'chinese': 95}
        },
        's003': {
            'name': '小刚',
            'age': 15,
            'gender': '男',
            'grades': {'math': 76, 'english': 85, 'chinese': 89}
        }
    }
}

# 添加新学生
class_info['students']['s004'] = {
    'name': '小丽',
    'age': 14,
    'gender': '女',
    'grades': {'math': 92, 'english': 90, 'chinese': 88}
}
print("添加新学生后,班级共有", len(class_info['students']), "名学生")

# 查询特定学生信息
student_id = 's002'
if student_id in class_info['students']:
    student = class_info['students'][student_id]
    print(f"学号: {student_id}")
    print(f"姓名: {student['name']}")
    print(f"年龄: {student['age']}")
    print(f"性别: {student['gender']}")
    print(f"成绩: {student['grades']}")

# 更新学生信息
class_info['students']['s001']['age'] = 16
class_info['students']['s001']['grades']['math'] = 90
print(f"更新后,小明的年龄: {class_info['students']['s001']['age']}")
print(f"更新后,小明的数学成绩: {class_info['students']['s001']['grades']['math']}")

# 计算各科平均分
total_math = 0
total_english = 0
total_chinese = 0
num_students = len(class_info['students'])

for student in class_info['students'].values():
    total_math += student['grades']['math']
    total_english += student['grades']['english']
    total_chinese += student['grades']['chinese']

avg_math = total_math / num_students
avg_english = total_english / num_students
avg_chinese = total_chinese / num_students

print("\n班级平均分:")
print(f"数学: {avg_math:.1f}")
print(f"英语: {avg_english:.1f}")
print(f"语文: {avg_chinese:.1f}")

# 找出各科最高分和对应的学生
max_math = -1
max_math_student = ""

for student_id, student in class_info['students'].items():
    if student['grades']['math'] > max_math:
        max_math = student['grades']['math']
        max_math_student = student['name']

print(f"\n数学最高分是{max_math_student}的{max_math}分")
运行上面的代码,输出结果为:

添加新学生后,班级共有 4 名学生
学号: s002
姓名: 小红
年龄: 14
性别: 女
成绩: {'math': 90, 'english': 88, 'chinese': 95}
更新后,小明的年龄: 16
更新后,小明的数学成绩: 90

班级平均分:
数学: 86.0
英语: 88.8
语文: 87.5

数学最高分是小丽的92分

练习题

1 字典基本操作

1. 创建一个表示图书信息的字典,包含以下键:title(书名)、author(作者)、publisher(出版社)、year(出版年份)、price(价格)和tags(标签列表) 2. 访问并打印所有的图书信息 3. 更新图书的价格 4. 添加一个新的键值对表示页数 5. 删除出版社信息 6. 检查图书是否包含ISBN键

2 单词频率统计

1. 创建一个字符串,表示一段文本 2. 将文本拆分成单词列表 3. 创建一个字典,用于统计每个单词出现的次数 4. 找出出现频率最高的单词 5. 过滤掉频率低于某个阈值的单词

3 嵌套字典操作

1. 创建一个嵌套字典,表示学校的课程表,其中外层字典的键是星期几,内层字典的键是时间段,值是课程名称 2. 访问并打印星期一上午的课程 3. 添加一节新的课程 4. 修改某一节课程的信息 5. 删除某一节课程 6. 检查星期三下午是否有课程 7. 统计一周共有多少节课