知识点概述

键值对数据结构、字典操作、字典推导式

学习Python中的字典数据结构,掌握键值对的存储和操作,这是处理结构化数据的重要工具。

详细讲解

字典基础

字典是Python中另一种重要的数据结构,用于存储键值对。字典是无序的(Python 3.7+保持插入顺序),键必须是不可变类型。

创建字典:

  • 使用花括号:dict1 = {"key": "value"}
  • 使用dict()函数:dict2 = dict(name="张三", age=15)
  • 空字典:empty_dict = {}empty_dict = dict()
  • 字典的键必须是不可变类型(字符串、数字、元组)
  • 字典的值可以是任何类型,包括列表、字典等

访问字典值:

  • 通过键访问:dict["key"](如果键不存在会引发KeyError)
  • 使用get()方法:dict.get("key")(键不存在返回None)
  • 使用get()带默认值:dict.get("key", "default")
  • 使用setdefault():如果键不存在则设置默认值并返回
  • 使用in检查键是否存在:"key" in dict

修改字典:

  • 添加/修改元素:dict["new_key"] = "value"
  • update()方法:合并另一个字典,重复的键会被覆盖
  • setdefault()方法:如果键不存在则设置默认值
  • 从Python 3.9开始可以使用||=操作符合并字典

删除字典元素:

  • pop(key):删除指定键并返回值
  • popitem():删除并返回最后一个键值对
  • del dict[key]:删除指定键值对
  • clear():清空字典
  • del dict:删除整个字典

遍历字典:

  • 遍历键:for key in dict:for key in dict.keys():
  • 遍历值:for value in dict.values():
  • 遍历键值对:for key, value in dict.items():
  • 使用enumerate同时获取索引:for i, (key, value) in enumerate(dict.items()):

字典推导式:

字典推导式提供了一种简洁的方法来创建字典。

  • 基本语法:{key_expr: value_expr for item in iterable}
  • 带条件过滤:{key_expr: value_expr for item in iterable if condition}
  • 遍历两个列表创建字典:{keys[i]: values[i] for i in range(len(keys))}
  • 示例:
    • {x: x**2 for x in range(5)}
    • {word: len(word) for word in ["apple", "banana"]}
    • {k: v for k, v in original_dict.items() if v > 10}

字典嵌套:

字典的值可以是任何类型,包括列表、元组甚至其他字典,这允许创建复杂的数据结构。

  • 字典列表:[{"name": "张三"}, {"name": "李四"}]
  • 列表字典:{"students": ["张三", "李四"], "scores": [95, 88]}
  • 字典嵌套字典:{"class1": {"teacher": "王老师"}, "class2": {"teacher": "李老师"}}
  • 访问嵌套字典:dict["outer"]["inner"]

代码示例

dictionaries.py
# 字典示例

# 创建字典
student = {
    "name": "张三",
    "age": 15,
    "grade": "八年级",
    "subjects": ["数学", "语文", "英语"],
    "scores": {
        "数学": 95,
        "语文": 88,
        "英语": 92
    }
}

print("学生信息:")
print(student)

# 访问字典值
print("\n=== 访问字典 ===")
print("学生姓名:", student["name"])
print("学生年龄:", student.get("age"))
print("使用get带默认值:", student.get("address", "未提供"))

# 修改字典
print("\n=== 修改字典 ===")
student["age"] = 16  # 修改值
student["school"] = "第一中学"  # 添加新键值对
student.setdefault("class", "八(3)班")  # 如果键不存在则设置默认值
print("修改后的学生信息:", student)

# 删除元素
print("\n=== 删除元素 ===")
removed_grade = student.pop("grade")  # 删除并返回
print(f"删除的年级: {removed_grade}")

removed_item = student.popitem()  # 删除最后一个键值对
print(f"删除的最后一个项: {removed_item}")
print("删除后字典:", student)

# 遍历字典
print("\n=== 遍历字典 ===")
print("遍历键:")
for key in student:
    print(f"  {key}: {student[key]}")

print("\n遍历值:")
for value in student.values():
    print(f"  {value}")

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

# 字典嵌套
print("\n=== 字典嵌套 ===")
classroom = {
    "teacher": "王老师",
    "students": [
        {"name": "小明", "score": 95, "hobbies": ["篮球", "编程"]},
        {"name": "小红", "score": 88, "hobbies": ["绘画", "音乐"]},
        {"name": "小刚", "score": 92, "hobbies": ["足球", "阅读"]}
    ],
    "subject": "Python编程",
    "schedule": {
        "周一": "14:00-15:30",
        "周三": "14:00-15:30",
        "周五": "10:00-11:30"
    }
}

print("班级信息:")
print(f"老师: {classroom['teacher']}")
print(f"科目: {classroom['subject']}")

print("\n学生成绩:")
for student in classroom["students"]:
    print(f"  {student['name']}: {student['score']}分")

print("\n课程安排:")
for day, time in classroom["schedule"].items():
    print(f"  {day}: {time}")

# 字典推导式
print("\n=== 字典推导式 ===")
numbers = [1, 2, 3, 4, 5]
squares_dict = {x: x**2 for x in numbers}
print("数字平方字典:", squares_dict)

words = ["apple", "banana", "cherry", "date"]
length_dict = {word: len(word) for word in words}
print("单词长度字典:", length_dict)

# 过滤字典
scores = {"数学": 95, "语文": 88, "英语": 92, "物理": 78, "化学": 85}
good_scores = {subject: score for subject, score in scores.items() if score >= 85}
print("良好成绩科目:", good_scores)

# 字典合并
print("\n=== 字典合并 ===")
dict1 = {"a": 1, "b": 2}
dict2 = {"b": 3, "c": 4}  # 注意键"b"重复

# 方法1: update()
dict3 = dict1.copy()
dict3.update(dict2)
print("update()合并:", dict3)

# 方法2: **操作符 (Python 3.5+)
dict4 = {**dict1, **dict2}
print("**操作符合并:", dict4)

# 方法3: | 操作符 (Python 3.9+)
# dict5 = dict1 | dict2
# print("| 操作符合并:", dict5)

# 字典常用方法
print("\n=== 字典常用方法 ===")
inventory = {"苹果": 10, "香蕉": 5, "橙子": 8, "葡萄": 15}
print("库存字典:", inventory)

print("\n所有键:", list(inventory.keys()))
print("所有值:", list(inventory.values()))
print("所有键值对:", list(inventory.items()))

print("\n苹果数量:", inventory.get("苹果", 0))
print("梨子数量:", inventory.get("梨子", 0))

inventory_copy = inventory.copy()
print("字典副本:", inventory_copy)

print("\n清空字典...")
inventory.clear()
print("清空后:", inventory)

输出结果:

学生信息:
{'name': '张三', 'age': 15, 'grade': '八年级', 'subjects': ['数学', '语文', '英语'], 'scores': {'数学': 95, '语文': 88, '英语': 92}}

=== 访问字典 ===
学生姓名: 张三
学生年龄: 15
使用get带默认值: 未提供

=== 修改字典 ===
修改后的学生信息: {'name': '张三', 'age': 16, 'grade': '八年级', 'subjects': ['数学', '语文', '英语'], 'scores': {'数学': 95, '语文': 88, '英语': 92}, 'school': '第一中学', 'class': '八(3)班'}

=== 删除元素 ===
删除的年级: 八年级
删除的最后一个项: ('class', '八(3)班')
删除后字典: {'name': '张三', 'age': 16, 'subjects': ['数学', '语文', '英语'], 'scores': {'数学': 95, '语文': 88, '英语': 92}, 'school': '第一中学'}

=== 遍历字典 ===
遍历键:
  name: 张三
  age: 16
  subjects: ['数学', '语文', '英语']
  scores: {'数学': 95, '语文': 88, '英语': 92}
  school: 第一中学

遍历值:
  张三
  16
  ['数学', '语文', '英语']
  {'数学': 95, '语文': 88, '英语': 92}
  第一中学

遍历键值对:
  name: 张三
  age: 16
  subjects: ['数学', '语文', '英语']
  scores: {'数学': 95, '语文': 88, '英语': 92}
  school: 第一中学

=== 字典嵌套 ===
班级信息:
老师: 王老师
科目: Python编程

学生成绩:
  小明: 95分
  小红: 88分
  小刚: 92分

课程安排:
  周一: 14:00-15:30
  周三: 14:00-15:30
  周五: 10:00-11:30

=== 字典推导式 ===
数字平方字典: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
单词长度字典: {'apple': 5, 'banana': 6, 'cherry': 6, 'date': 4}
良好成绩科目: {'数学': 95, '英语': 92, '化学': 85}

=== 字典合并 ===
update()合并: {'a': 1, 'b': 3, 'c': 4}
**操作符合并: {'a': 1, 'b': 3, 'c': 4}

=== 字典常用方法 ===
库存字典: {'苹果': 10, '香蕉': 5, '橙子': 8, '葡萄': 15}

所有键: ['苹果', '香蕉', '橙子', '葡萄']
所有值: [10, 5, 8, 15]
所有键值对: [('苹果', 10), ('香蕉', 5), ('橙子', 8), ('葡萄', 15)]

苹果数量: 10
梨子数量: 0

字典副本: {'苹果': 10, '香蕉': 5, '橙子': 8, '葡萄': 15}

清空字典...
清空后: {}

学习提示

1

字典的键必须是不可变类型(字符串、数字、元组)。

2

使用get()方法访问字典可以避免KeyError异常。

3

字典推导式是创建字典的简洁方法,但复杂的推导式可能降低可读性。

4

字典在Python 3.7+中保持插入顺序,但在之前版本中是无序的。

练习题

练习 1 中等

创建一个字典存储学生信息(姓名、年龄、成绩),并实现查询功能。

使用字典存储信息,通过输入的学生姓名查询。

练习 2 中等

编写一个函数,统计字符串中每个字符出现的次数。

遍历字符串,使用字典统计每个字符出现的次数。

练习 3 困难

使用字典推导式创建1-10的数字及其立方的字典。

字典推导式格式:{x: x**3 for x in range(1, 11)}

练习 4 困难

合并两个字典,处理重复键的情况(如取平均值)。

先合并,然后对重复键的值进行特殊处理。

知识点总结

本课要点:

  • 掌握字典的创建和基本操作
  • 熟练使用字典的增删改查方法
  • 理解字典的遍历方式
  • 学会使用字典推导式创建新字典

课程总结:

恭喜你完成了七年级到八年级的Python知识点学习!你已经掌握了从基础到进阶的Python编程知识。

返回主页回顾所有知识点