Python 字典
什么是字典?
字典是Python中的一种重要数据结构,它以键值对(key-value pair)的形式存储数据。Python字典是无序的、可变的、不允许重复键的集合。字典通过键来访问值,而不是像列表那样通过索引。
字典的特点:
- 使用花括号
{}
定义 - 每个键值对用冒号
:
分隔 - 不同键值对之间用逗号
,
分隔 - 键必须是唯一的且不可变(通常是字符串、数字或元组)
- 值可以是任何数据类型
创建字典
基本创建方法
python
# 创建空字典
empty_dict = {}
empty_dict_2 = dict()
# 创建带有初始键值对的字典
student = {
"name": "张三",
"age": 20,
"major": "计算机科学",
"gpa": 3.8
}
print(student)
输出:
{'name': '张三', 'age': 20, 'major': '计算机科学', 'gpa': 3.8}
使用dict()构造函数
python
# 从键值对序列创建
student = dict([("name", "张三"), ("age", 20), ("major", "计算机科学")])
# 使用关键字参数创建
student = dict(name="张三", age=20, major="计算机科学")
print(student)
输出:
{'name': '张三', 'age': 20, 'major': '计算机科学'}
字典推导式
python
# 从1到5的平方字典
squares = {x: x*x for x in range(1, 6)}
print(squares)
输出:
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
访问字典元素
可以通过键来访问字典中的值。
python
student = {"name": "张三", "age": 20, "major": "计算机科学"}
# 使用键访问值
print(student["name"])
# 使用get()方法安全访问
print(student.get("gpa")) # 如果键不存在返回None
print(student.get("gpa", 0.0)) # 如果键不存在返回默认值
输出:
张三
None
0.0
警告
直接使用键访问不存在的元素会引发KeyError异常,而get()方法则不会。
修改字典
添加或更新元素
python
student = {"name": "张三", "age": 20}
# 添加新键值对
student["major"] = "计算机科学"
# 更新已有键的值
student["age"] = 21
print(student)
输出:
{'name': '张三', 'age': 21, 'major': '计算机科学'}
使用update()方法批量添加或更新
python
student = {"name": "张三", "age": 20}
# 使用update()方法更新多个键值对
student.update({"major": "计算机科学", "gpa": 3.8, "age": 21})
print(student)
输出:
{'name': '张三', 'age': 21, 'major': '计算机科学', 'gpa': 3.8}
删除字典元素
python
student = {"name": "张三", "age": 20, "major": "计算机科学", "gpa": 3.8}
# 使用del删除指定键
del student["gpa"]
print("删除GPA后:", student)
# 使用pop()删除指定键并返回值
major = student.pop("major")
print(f"专业是: {major}")
print("删除专业后:", student)
# 使用popitem()随机删除一个键值对(Python 3.7+是删除最后添加的项)
last_item = student.popitem()
print(f"删除的最后一项: {last_item}")
print("最终字典:", student)
# 清空字典
student.clear()
print("清空后:", student)
输出:
删除GPA后: {'name': '张三', 'age': 20, 'major': '计算机科学'}
专业是: 计算机科学
删除专业后: {'name': '张三', 'age': 20}
删除的最后一项: ('age', 20)
最终字典: {'name': '张三'}
清空后: {}
字典常用操作
检查键是否存在
python
student = {"name": "张三", "age": 20, "major": "计算机科学"}
# 使用in关键字
if "name" in student:
print("姓名存在于字典中")
if "gpa" not in student:
print("GPA不在字典中")
输出:
姓名存在于字典中
GPA不在字典中
遍历字典
python
student = {"name": "张三", "age": 20, "major": "计算机科学"}
# 遍历所有键
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}")
输出:
所有键:
name
age
major
所有值:
张三
20
计算机科学
所有键值对:
name: 张三
age: 20
major: 计算机科学
获取字典信息
python
student = {"name": "张三", "age": 20, "major": "计算机科学"}
# 获取字典长度
print(f"字典长度: {len(student)}")
# 获取所有键、值、键值对
print(f"所有键: {list(student.keys())}")
print(f"所有值: {list(student.values())}")
print(f"所有键值对: {list(student.items())}")
输出:
字典长度: 3
所有键: ['name', 'age', 'major']
所有值: ['张三', 20, '计算机科学']
所有键值对: [('name', '张三'), ('age', 20), ('major', '计算机科学')]
嵌套字典
字典的值可以是任何数据类型,包括其他字典,这样就形成了嵌套字典。
python
# 包含学生信息的嵌套字典
students = {
"1001": {
"name": "张三",
"age": 20,
"courses": ["数学", "物理", "计算机"]
},
"1002": {
"name": "李四",
"age": 19,
"courses": ["历史", "地理", "英语"]
}
}
# 访问嵌套字典的元素
print(f"学号1001的学生姓名: {students['1001']['name']}")
print(f"学号1002的第一门课程: {students['1002']['courses'][0]}")
# 修改嵌套字典的元素
students["1001"]["age"] = 21
students["1002"]["courses"].append("生物")
print("\n修改后的学生信息:")
print(students)
输出:
学号1001的学生姓名: 张三
学号1002的第一门课程: 历史
修改后的学生信息:
{'1001': {'name': '张三', 'age': 21, 'courses': ['数学', '物理', '计算机']}, '1002': {'name': '李四', 'age': 19, 'courses': ['历史', '地理', '英语', '生物']}}
字典方法总结
以下是Python字典的常用方法:
方法 | 描述 |
---|---|
clear() | 删除字典中的所有项 |
copy() | 返回字典的浅复制 |
fromkeys(seq, val) | 创建一个新字典,以seq为键,val为对应的值 |
get(key, default) | 返回指定键的值,如果键不存在返回默认值None |
items() | 返回字典中所有的(键, 值)对 |
keys() | 返回字典中的所有键 |
pop(key, default) | 删除指定键并返回对应值,如果键不存在返回default |
popitem() | 随机返回并删除字典中的一项 |
setdefault(key, default) | 如果键存在,返回其值;如果不存在,插入键并设为default |
update(dict2) | 用dict2更新字典,覆盖已有键 |
values() | 返回字典中的所有值 |
实际应用场景
场景一:学生成绩管理系统
python
# 创建一个简单的学生成绩管理系统
def manage_grades():
# 初始化学生成绩字典
grades = {}
# 添加学生成绩
def add_student(student_id, name):
if student_id in grades:
print(f"学号 {student_id} 已存在!")
return False
grades[student_id] = {"name": name, "courses": {}}
print(f"成功添加学生: {name}, 学号: {student_id}")
return True
# 添加课程成绩
def add_course_grade(student_id, course, grade):
if student_id not in grades:
print(f"学号 {student_id} 不存在!")
return False
grades[student_id]["courses"][course] = grade
print(f"已为 {grades[student_id]['name']} 添加 {course} 课程成绩: {grade}")
return True
# 查询学生所有成绩
def get_student_grades(student_id):
if student_id not in grades:
print(f"学号 {student_id} 不存在!")
return None
student = grades[student_id]
print(f"学号: {student_id}, 姓名: {student['name']}的成绩:")
if not student["courses"]:
print(" 暂无课程成绩")
return student
for course, grade in student["courses"].items():
print(f" {course}: {grade}")
return student
# 计算学生平均分
def calculate_average(student_id):
if student_id not in grades or not grades[student_id]["courses"]:
return 0
courses = grades[student_id]["courses"]
return sum(courses.values()) / len(courses)
# 示例操作
add_student("1001", "张三")
add_student("1002", "李四")
add_course_grade("1001", "数学", 95)
add_course_grade("1001", "英语", 85)
add_course_grade("1001", "物理", 90)
add_course_grade("1002", "数学", 75)
add_course_grade("1002", "英语", 92)
get_student_grades("1001")
get_student_grades("1002")
# 计算并显示平均分
print(f"张三的平均分: {calculate_average('1001'):.2f}")
print(f"李四的平均分: {calculate_average('1002'):.2f}")
# 运行示例
manage_grades()
输出:
成功添加学生: 张三, 学号: 1001
成功添加学生: 李四, 学号: 1002
已为 张三 添加 数学 课程成绩: 95
已为 张三 添加 英语 课程成绩: 85
已为 张三 添加 物理 课程成绩: 90
已为 李四 添加 数学 课程成绩: 75
已为 李四 添加 英语 课程成绩: 92
学号: 1001, 姓名: 张三的成绩:
数学: 95
英语: 85
物理: 90
学号: 1002, 姓名: 李四的成绩:
数学: 75
英语: 92
张三的平均分: 90.00
李四的平均分: 83.50
场景二:单词频率统计
python
def word_frequency_counter(text):
# 移除标点符号并转换为小写
for char in ',.!?;:()[]{}""\'':
text = text.replace(char, '')
text = text.lower()
# 分割文本并统计词频
words = text.split()
word_freq = {}
for word in words:
# 如果单词已在字典中,增加计数;否则添加新条目
if word in word_freq:
word_freq[word] += 1
else:
word_freq[word] = 1
return word_freq
def analyze_text_word_frequency(text):
word_freq = word_frequency_counter(text)
# 按频率从高到低排序
sorted_words = sorted(word_freq.items(), key=lambda x: x[1], reverse=True)
# 打印结果
print("单词频率统计结果:")
for word, freq in sorted_words:
print(f"{word}: {freq}")
# 打印总单词数和不同单词数
total_words = sum(word_freq.values())
unique_words = len(word_freq)
print(f"\n总单词数: {total_words}")
print(f"不同单词数: {unique_words}")
# 示例文本
sample_text = """
Python是一种广泛使用的解释型、高级编程语言。Python的设计强调代码的可读性和简洁的语法,
使开发者能够用更少的代码表达想法。不管是小型脚本还是大型系统,Python都是一个理想的语言。
Python支持多种编程范式,包括面向对象、命令式、函数式和过程式编程。
"""
analyze_text_word_frequency(sample_text)
输出:
单词频率统计结果:
python: 3
的: 3
语言: 2
程序: 2
编程: 2
是: 2
一种: 1
广泛使用: 1
解释型: 1
高级: 1
的设计强调代码: 1
可读性和简洁: 1
语法: 1
(省略部分输出...)
总单词数: 45
不同单词数: 33
总结
字典是Python中强大且灵活的数据结构,提供了高效的数据访问和管理能力:
- 键值对存储: 字典以键值对形式存储数据,允许通过唯一键快速访问值
- 灵活性: 键可以是任何不可变类型,值可以是任意Python对象
- 高效查找: 基于哈希表实现,提供O(1)平均查找复杂度
- 易于修改: 可以动态地添加、修改和删除键值对
- 丰富的内置方法: 提供多种操作方法如keys()、values()、items()等
Python字典广泛应用于各种场景,包括但不限于:
- 配置信息存储
- 缓存实现
- 数据统计和分析
- 模拟简单数据库
- JSON数据处理
掌握字典操作是Python编程的基础技能之一,熟练运用字典可以使你的代码更简洁高效。
练习题
- 创建一个字典,存储5个国家及其首都,然后打印出来。
- 编写一个函数,接受一个字典和一个键,如果键存在则返回对应的值,否则返回"键不存在"。
- 创建一个字典,统计一个给定字符串中每个字符出现的次数。
- 实现一个简单的英汉词典,允许用户添加单词、查询单词和删除单词。
- 编写一个函数,合并两个字典,如果有重复的键,使用第二个字典的值。