跳到主要内容

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中强大且灵活的数据结构,提供了高效的数据访问和管理能力:

  1. 键值对存储: 字典以键值对形式存储数据,允许通过唯一键快速访问值
  2. 灵活性: 键可以是任何不可变类型,值可以是任意Python对象
  3. 高效查找: 基于哈希表实现,提供O(1)平均查找复杂度
  4. 易于修改: 可以动态地添加、修改和删除键值对
  5. 丰富的内置方法: 提供多种操作方法如keys()、values()、items()等

Python字典广泛应用于各种场景,包括但不限于:

  • 配置信息存储
  • 缓存实现
  • 数据统计和分析
  • 模拟简单数据库
  • JSON数据处理

掌握字典操作是Python编程的基础技能之一,熟练运用字典可以使你的代码更简洁高效。

练习题

  1. 创建一个字典,存储5个国家及其首都,然后打印出来。
  2. 编写一个函数,接受一个字典和一个键,如果键存在则返回对应的值,否则返回"键不存在"。
  3. 创建一个字典,统计一个给定字符串中每个字符出现的次数。
  4. 实现一个简单的英汉词典,允许用户添加单词、查询单词和删除单词。
  5. 编写一个函数,合并两个字典,如果有重复的键,使用第二个字典的值。

进一步学习资源