第十四课:有“标签”的数据 – 字典 (Dictionary)

  • 时长: 90 分钟
  • 教学目标:
    • 理解“字典”的概念:一种通过“标签”(键 Key)来查找对应“值”(Value)的数据结构。
    • 理解字典和列表的区别:列表按顺序(索引)查找,字典按标签(键)查找。
    • 学会创建字典 {}
    • 掌握如何通过“键”来访问、修改字典里的“值”。
    • 学习向字典中添加新的“键值对”。
    • 学习从字典中删除“键值对”。
    • 学会获取字典中所有的“键”、“值”或“键值对”。
    • 学习使用 in 运算符检查字典中是否存在某个“键”。

课程内容

1. 复习与引入 (10 分钟)

  • 复习: 快速回顾列表的使用(通过索引找数据)和函数的定义调用。
  • 提出问题: 老师提问:“我们用列表存储了一系列的分数 [85, 92, 78]。如果我想知道某个同学(比如‘小明’)的分数是多少,我怎么知道 85 分是小明的呢?我们不能直接用名字去列表里找,列表只能用索引找。”
  • 引出字典: 在现实生活中,我们有很多数据是有关联的,比如:每个学生的学号对应一个名字,每种商品有一个名字对应一个价格,每个单词对应它的解释。列表用数字编号来找东西,但如果我想用一个有意义的“标签”(比如名字、学号、商品名)来找到它关联的数据,就需要一种新的数据结构——字典 (Dictionary)。字典就像一本真正的字典,通过查找单词(键),找到对应的解释(值)。

2. 什么是字典?如何创建? (15 分钟)

  • 概念: 字典是无序的(在较老的 Python 版本中是无序的,新版本有顺序,但我们通常不依赖它的顺序),由一系列“键值对” (Key-Value Pair) 组成。每个“键”是唯一的,通过“键”可以快速找到它对应的“值”。
  • 打个比方: 字典就像:
    • 电话簿:名字 (键) → 电话号码 (值)。
    • 班级花名册:学号 (键) → 学生信息 (值)。
    • 菜单:菜名 (键) → 价格 (值)。
  • 创建语法: 使用花括号 {} 来创建字典。每个键值对写成 键: 值 的形式,不同的键值对之间用逗号 , 分隔。
    # 创建一个空的字典
    empty_dict = {}
    
    # 创建一个存放学生分数的字典 (键是名字,值是分数)
    student_scores = {"小明": 85, "小红": 92, "小刚": 78}
    
    # 创建一个存放商品价格的字典 (键是商品名,值是价格)
    product_prices = {"苹果": 2.5, "面包": 5.0, "鸡蛋": 1.2}
    
    # 字典的键可以是字符串或数字等不可变类型,值可以是任意类型
    my_dict = {"name": "Python", 1: [1, 2, 3], "info": {"version": 3.10}}
    
    # 打印字典
    print(student_scores)
    print(product_prices)
    print(my_dict)
    
  • 键的特点: 字典的“键”必须是唯一的,而且必须是不可变的类型(比如字符串、数字、元组)。通常我们用字符串作为键。
  • 值的特点: 字典的“值”可以是任意类型,可以重复。

3. 访问和修改字典的值 (15 分钟)

  • 访问值: 使用方括号 [] 和对应的来访问字典里的值。
    student_scores = {"小明": 85, "小红": 92, "小刚": 78}
    print(student_scores["小明"]) # 通过键 "小明" 访问对应的值 85
    print(student_scores["小刚"]) # 通过键 "小刚" 访问对应的值 78
    
    # 如果尝试访问一个不存在的键,会报错!
    # print(student_scores["小丽"]) # 错误!键 "小丽" 不存在
    
  • 修改值: 通过键访问到对应的值后,可以直接使用 = 重新赋值来修改。
    student_scores = {"小明": 85, "小红": 92, "小刚": 78}
    print("修改前:", student_scores)
    student_scores["小明"] = 90 # 把 "小明" 的分数改成 90
    print("修改后:", student_scores) # 结果是 {"小明": 90, "小红": 92, "小刚": 78}
    
  • 动手实践: 学生创建一个字典(比如记录家庭成员的姓名和年龄),尝试通过姓名访问年龄,并尝试修改其中某个成员的年龄。

4. 往字典里添加和删除“键值对” (15 分钟)

  • 添加键值对: 使用方括号 [] 和一个新的键,给它赋予一个值,就可以添加一对新的键值对。
    student_scores = {"小明": 85, "小红": 92}
    print("添加前:", student_scores)
    student_scores["小刚"] = 78 # 添加新的键值对 "小刚": 78
    student_scores["小丽"] = 95 # 添加新的键值对 "小丽": 95
    print("添加后:", student_scores) # 结果是 {"小明": 85, "小红": 92, "小刚": 78, "小丽": 95}
    

    注意:如果键已经存在,这种方法会直接修改对应的值(和上面的修改操作一样)。

  • 删除键值对: 使用 del 关键字加上字典名和要删除的键 字典名[键]
    student_scores = {"小明": 85, "小红": 92, "小刚": 78}
    print("删除前:", student_scores)
    del student_scores["小红"] # 删除键为 "小红" 的键值对
    print("删除后:", student_scores) # 结果是 {"小明": 85, "小刚": 78}
    
    # 如果尝试删除一个不存在的键,会报错!
    # del student_scores["小芳"] # 错误!
    

    (可选:简单介绍 .pop(键) 方法删除并返回指定键的值:removed_score = student_scores.pop("小刚")

  • 动手实践: 学生创建一个字典,尝试添加新的键值对。 尝试删除字典中的某个键值对。

5. 获取字典的“键”、“值”和“项目” (15 分钟)

  • .keys(): 获取字典中所有的键。返回一个“视图对象”,可以转换为列表。
    student_scores = {"小明": 85, "小红": 92, "小刚": 78}
    keys_view = student_scores.keys()
    print(keys_view) # 输出类似 dict_keys(['小明', '小红', '小刚'])
    print(list(keys_view)) # 转换为列表 ['小明', '小红', '小刚']
    
  • .values(): 获取字典中所有的值。返回一个“视图对象”,可以转换为列表。
    values_view = student_scores.values()
    print(values_view) # 输出类似 dict_values([85, 92, 78])
    print(list(values_view)) # 转换为列表 [85, 92, 78]
    
  • .items(): 获取字典中所有的键值对。每个键值对表示为一个元组 (键, 值)。返回一个“视图对象”,可以转换为列表。
    items_view = student_scores.items()
    print(items_view) # 输出类似 dict_items([('小明', 85), ('小红', 92), ('小刚', 78)])
    print(list(items_view)) # 转换为列表 [('小明', 85), ('小红', 92), ('小刚', 78)]
    
  • 检查键是否存在 – in: 使用 in 运算符可以快速检查一个是否在字典中。
    student_scores = {"小明": 85, "小红": 92}
    print("小明" in student_scores) # True
    print("小丽" in student_scores) # False
    
    # 注意:in 默认是检查键,不是检查值
    print(85 in student_scores) # False (检查的是键 85 是否存在)
    print(85 in student_scores.values()) # True (检查值 85 是否存在)
    
  • 动手实践: 学生创建一个字典,分别获取它的键、值和键值对,并打印出来。 使用 in 检查某个键是否存在。

6. 遍历字典 (10 分钟)

  • 默认遍历 (遍历键): 使用 for 循环直接遍历字典,默认是遍历字典的
    student_scores = {"小明": 85, "小红": 92, "小刚": 78}
    print("--- 遍历键 ---")
    for name in student_scores: # name 会依次是 "小明", "小红", "小刚"
        print(name)
    
  • 遍历值: 结合 .values() 方法遍历字典的值。
    print("--- 遍历值 ---")
    for score in student_scores.values(): # score 会依次是 85, 92, 78
        print(score)
    
  • 遍历键值对: 结合 .items() 方法遍历字典的键值对。在 for 循环中使用两个变量来接收键和值。
    print("--- 遍历键值对 ---")
    for name, score in student_scores.items(): # name 接收键,score 接收值
        print(name, "的分数是", score)
    
  • 动手实践: 学生创建一个字典,分别演示如何遍历它的键、值和键值对。

7. 课堂练习 (10 分钟)

让学生独立完成以下练习:

  • 练习 1: 创建一个字典,存放你喜欢的 3 种水果的名字和它们的颜色(键是水果名,值是颜色)。
    • 打印出“苹果”的颜色。
    • 向字典中添加一种新的水果和颜色。
    • 删除字典中的“香蕉”。
    • 打印修改后的字典。
      # 在这里创建你的字典
      fruits_color = {"apple": "red", ...}
      # TODO: 访问并打印苹果的颜色
      # TODO: 添加新的水果和颜色
      # TODO: 删除香蕉
      # TODO: 打印最终字典
      
  • 练习 2: 创建一个字典,存放一些城市的名字和它们的人口数量。使用 for 循环遍历字典,打印出每个城市的名字和对应的人口数量。
  • 练习 3: 创建一个字典,存放商品的名称和价格。让用户输入一个商品名称,如果字典中有这个商品,就打印它的价格;如果商品不存在,就打印“抱歉,我们没有这个商品。”(提示:使用 in 运算符检查键是否存在)。

8. 总结与提问 (5 分钟)

  • 回顾: 回顾本节课内容:字典的概念(键值对,通过键查找),字典和列表的区别,创建字典 {},访问/修改值 字典[键],添加键值对 字典[新键] = 新值,删除键值对 del 字典[键],获取键/值/项目 (.keys(), .values(), .items()),检查键是否存在 键 in 字典,遍历字典(默认遍历键,遍历值 .values(),遍历键值对 .items())。
  • 提问:
    • 字典和列表有什么主要区别?
    • 字典是用什么符号创建的?列表呢?
    • 如何获取字典 my_dict = {"a": 1, "b": 2} 中键为 “b” 的值?
    • 如何向字典中添加一对新的键值对 “c”: 3?
    • key in my_dict 是检查键还是检查值是否存在?
    • 如何遍历字典,同时获取所有的键和对应的值?
  • 答疑: 回答学生问题。

9. 布置课后作业 (5 分钟)

  • 作业 1: 创建一个字典,存放你同学或家人的英文名字和他们的中文名字。使用 for 循环遍历字典,打印出每一对名字:“[英文名] 的中文名字是 [中文名]”。
  • 作业 2: 创建一个字典,存放一些国家的名字和它们的首都是什么。让用户输入一个国家的名字,打印出它的首都。如果用户输入的国家不在字典中,提示用户“抱歉,字典中没有这个国家的信息。”
  • 作业 3: 编写一个程序,创建一个字典,存放一些物品的名称和它们的数量。
    • 计算并打印所有物品的总数量。(提示:遍历字典的值并求和)。
    • 找出数量大于 10 的物品,打印它们的名称和数量。
  • 作业 4: (选做) 编写一个简单的电话簿程序。使用一个字典来存储姓名和电话号码。提供功能让用户选择:添加联系人、查找联系人(根据姓名查找号码)、删除联系人、显示所有联系人、退出。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。