字典(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键
book = {
'title': 'Python编程从入门到实践',
'author': '埃里克·马瑟斯',
'publisher': '人民邮电出版社',
'year': 2020,
'price': 89.0,
'tags': ['Python', '编程', '入门']
}
# 访问并打印所有图书信息
print("图书信息:")
for key, value in book.items():
print(f"{key}: {value}")
# 更新图书价格
book['price'] = 99.0
print(f"\n更新后的价格: {book['price']}")
# 添加页数信息
book['pages'] = 560
print(f"添加页数信息后: {book}")
# 删除出版社信息
del book['publisher']
print(f"\n删除出版社信息后: {book}")
# 检查图书是否包含ISBN键
if 'ISBN' in book:
print("图书包含ISBN信息")
else:
print("图书不包含ISBN信息")
# 使用get()方法安全访问不存在的键
isbn = book.get('ISBN', '未提供')
print(f"ISBN: {isbn}")
2 单词频率统计
1. 创建一个字符串,表示一段文本 2. 将文本拆分成单词列表 3. 创建一个字典,用于统计每个单词出现的次数 4. 找出出现频率最高的单词 5. 过滤掉频率低于某个阈值的单词
text = "Python is a popular programming language. Python is easy to learn and powerful. Python is used for web development, data analysis, artificial intelligence and more."
# 将文本拆分成单词列表
# 首先转换为小写,然后替换标点符号,最后拆分
text = text.lower()
for char in ",.!?:;":
text = text.replace(char, "")
words = text.split()
# 创建字典统计单词频率
word_counts = {}
for word in words:
if word in word_counts:
word_counts[word] += 1
else:
word_counts[word] = 1
print("单词频率统计:")
for word, count in word_counts.items():
print(f"{word}: {count}")
# 找出出现频率最高的单词
max_count = 0
most_frequent_word = ""
for word, count in word_counts.items():
if count > max_count:
max_count = count
most_frequent_word = word
print(f"\n出现频率最高的单词是 '{most_frequent_word}',出现了{max_count}次")
# 过滤掉频率低于2的单词
threshold = 2
filtered_words = {word: count for word, count in word_counts.items() if count >= threshold}
print(f"\n频率大于等于{threshold}的单词:")
for word, count in filtered_words.items():
print(f"{word}: {count}")
3 嵌套字典操作
1. 创建一个嵌套字典,表示学校的课程表,其中外层字典的键是星期几,内层字典的键是时间段,值是课程名称 2. 访问并打印星期一上午的课程 3. 添加一节新的课程 4. 修改某一节课程的信息 5. 删除某一节课程 6. 检查星期三下午是否有课程 7. 统计一周共有多少节课
timetable = {
'星期一': {
'08:00-09:40': '数学',
'10:00-11:40': '语文',
'13:30-15:10': '英语',
'15:30-17:10': '物理'
},
'星期二': {
'08:00-09:40': '化学',
'10:00-11:40': '生物',
'13:30-15:10': '历史',
'15:30-17:10': '地理'
},
'星期三': {
'08:00-09:40': '英语',
'10:00-11:40': '数学',
'15:30-17:10': '音乐'
},
'星期四': {
'08:00-09:40': '语文',
'10:00-11:40': '政治',
'13:30-15:10': '体育'
},
'星期五': {
'08:00-09:40': '物理',
'10:00-11:40': '化学',
'13:30-15:10': '生物',
'15:30-17:10': '美术'
}
}
# 访问并打印星期一上午的课程
print("星期一上午的课程:")
for time, course in timetable['星期一'].items():
if time.startswith('08') or time.startswith('10'):
print(f"{time}: {course}")
# 添加一节新的课程
timetable['星期三']['13:30-15:10'] = '计算机'
print("\n添加计算机课后的星期三课程:")
for time, course in timetable['星期三'].items():
print(f"{time}: {course}")
# 修改某一节课程的信息
timetable['星期四']['13:30-15:10'] = '信息技术'
print(f"\n修改后,星期四下午的课程: {timetable['星期四']['13:30-15:10']}")
# 删除某一节课程
del timetable['星期五']['15:30-17:10']
print("\n删除美术课后的星期五课程:")
for time, course in timetable['星期五'].items():
print(f"{time}: {course}")
# 检查星期三下午是否有课程
if '13:30-15:10' in timetable['星期三']:
print(f"\n星期三下午13:30-15:10有课程: {timetable['星期三']['13:30-15:10']}")
else:
print("\n星期三下午13:30-15:10没有课程")
# 统计一周共有多少节课
total_classes = 0
for day in timetable:
total_classes += len(timetable[day])
print(f"\n一周共有{total_classes}节课")