CC++ & Algorithm

Python字典 dict

较难3
语言版本:C++Python
概述:字典就像一本通讯录,通过“键”快速找到对应的“值”。

Python字典:像通讯录一样快速查找信息

同学,你有没有想过用一个名字(比如“小明”)直接找到他的电话号码?Python里的 字典(dict) 就是为了做这种事情而设计的。字典里每个条目都由两部分组成:键(key)值(value)。键就像是通讯录里的名字,值就是对应的电话号码。我们使用花括号 {} 来创建字典,键和值之间用冒号 : 隔开,不同条目用逗号隔开。

下面我们一步步认识这个“智能查找器”。

1. 创建字典——把你身边的信息存起来

最简单的字典就是一对花括号:{}。里面可以放多组“键:值”,每组之间用逗号分隔。比如记下班上同学的电话:

# 创建一个电话本字典,键是名字,值是电话号码
phone_book = {"小明": "138-0000-0001", "小红": "139-0000-0002", "小刚": "137-0000-0003"}
print(phone_book)

还可以用 dict() 函数来创建,比如:

# 用dict()和关键字参数创建字典
score = dict(小明=95, 小红=88, 小刚=76)  # 注意:关键字参数里不能加引号
print(score)  # 输出 {'小明': 95, '小红': 88, '小刚': 76}

空字典也有用——你可以先创建一个空字典,后面再慢慢往里加内容:

# 创建一个空字典,准备存零食价格
snack_price = {}

2. 查找信息——像翻通讯录一样快

要找到某个键对应的值,就用中括号 [键]。如果键存在,直接得到值;如果键不存在,程序会报错。

xiaoming_phone = phone_book["小明"]   # 查找小明电话
print("小明的电话是:", xiaoming_phone)

# 查找小红的爱好
hobby = {"小明": "踢足球", "小红": "画画", "小刚": "下棋"}
print(hobby["小红"])  # 输出“画画”

为了避免报错,可以使用更加安全的 get 方法。如果键不存在,可以返回一个默认值(比如 "找不到"):

# 用get方法查找,找不到时不报错
phone = phone_book.get("小丽", "未找到")   # 小丽不在字典里,返回"未找到"
print(phone)  # 输出:未找到

3. 修改和添加——随时更新你的数据

字典是可以改变的。如果某个键已经存在,给这个键赋值就会更新它的值;如果键不存在,就会新增一个条目。

# 更新:小明换电话号码了
phone_book["小明"] = "138-1111-1111"
print(phone_book)

# 添加:小丽加入班级
phone_book["小丽"] = "136-0000-0004"
print(phone_book)

就像你往通讯录里加新朋友,或者修改老朋友的信息一样简单。

4. 删除条目——不要的信息可以删掉

使用 del 语句可以删除指定键的条目。使用 pop 方法可以在删除的同时得到被删除的值。

# 删除小刚的电话
del phone_book["小刚"]
print(phone_book)   # 小刚被移除了

# 弹出小红的电话(得到值并删除)
red_phone = phone_book.pop("小红")
print("小红原来的电话是:", red_phone)
print(phone_book)   # 小红也不在了

如果删除的键不存在,del 会报错,而 pop 可以给第二个参数作为默认值来避免错误。

5. 遍历字典——把里面所有信息看一遍

for 循环可以快速查看字典里的每一对键和值。

# 遍历电话本,打印每个人的名字和电话
for name, number in phone_book.items():
    print(name, "的电话是", number)

如果只想看所有键,用 .keys();只想看所有值,用 .values()

# 打印所有同学的名字
for name in phone_book.keys():
    print(name)

# 打印所有电话号码
for number in phone_book.values():
    print(number)

6. 字典的两个重要特点

  1. 键必须是唯一的 —— 就像通讯录里不能有两个叫“小明”的人(如果有,后写的会覆盖先写的)。
  2. 键必须是不可变的类型 —— 比如字符串、数字、元组都可以做键,但列表、字典不能做键(因为这些可以改变,会扰乱查找)。

值可以是任何类型,甚至可以重复。比如两个人的兴趣都可以是“踢足球”。

新手最容易犯的错误

  • 访问不存在的键:直接 phone_book["小丽"] 会报 KeyError。要么先检查 if "小丽" in phone_book,要么用 get() 方法。
  • 忘记键和值之间的冒号:写成了 {"小明": "123"} 没错,但写成 {"小明", "123"} 就变成了集合,不是字典。
  • 认为字典是有序的:在 Python 3.7 之前字典是无序的,3.7 之后字典会保留插入顺序,但实际编程中不要依赖顺序,需要顺序请用列表。
  • 用可变类型做键:比如把列表 [1,2] 当键,会报 TypeError: unhashable type: 'list'

完整示例:用字典管理考试分数

下面是一个完整的程序,使用字典记录同学们的考试成绩,并做了一些常见操作。

# 创建一个字典,记录每位同学的语文成绩
scores = {"小明": 92, "小红": 85, "小刚": 78}   # 键是名字,值是分数

# 添加一位新同学的成绩
scores["小丽"] = 90

# 修改小刚的成绩(他重新考试了)
scores["小刚"] = 88

# 删除小红的成绩(她转学了)
del scores["小红"]

# 遍历打印所有同学的成绩
print("——期末成绩——")
for student, score in scores.items():
    print(student, ":", score, "分")

# 查看小明成绩,用get安全一点
ming_score = scores.get("小明", "未找到")
print("小明的成绩是:", ming_score)

# 查看小红的成绩(已被删除,不会报错)
hong_score = scores.get("小红", "未找到")
print("小红的成绩是:", hong_score)

运行结果:

——期末成绩——
小明 : 92 分
小刚 : 88 分
小丽 : 90 分
小明的成绩是: 92
小红的成绩是: 未找到

字典能做什么?更多生活中的例子

  • 零食价格表snack = {"薯片":5, "巧克力":8, "可乐":3},根据名字快速查价格。
  • 星期代号week = {1:"周一", 2:"周二", 3:"周三", 4:"周四", 5:"周五", 6:"周六", 7:"周日"},用数字找星期名。
  • 游戏道具items = {"剑":10, "盾":5, "药水":3},记录玩家身上每种道具的数量。

相关知识点指引

  • 列表:有序的序列,用下标访问。适合存放一组有序的东西,比如一列成绩。
  • 元组:不可变的列表,适合做字典的键。
  • 集合:无序不重复的元素集合,类似只有键没有值的字典。
  • 字典的嵌套:值可以是字典,比如 classmates = {"小明": {"语文":92, "数学":85}, "小红": {"语文":88, "数学":90}},可以表示更复杂的数据。

掌握了字典,你就能轻松处理各种“键→值”的对应关系,让程序像你的小助手一样,快速找到你需要的信息。

例题精讲

1单选题

以下哪个选项能够正确地创建一个非空字典?

Adict1 = {['name']: 'Alice', 'age': 12}
Bdict2 = {'name': 'Bob', 'age': 13}
Cdict3 = dict(['a', 1], ['b', 2])
Ddict4 = {'a': 1, 'b': 2, 'b': 3}
2单选题

已知字典 d = {'x': 10, 'y': 20},执行 d.get('z', 100) 的返回值是什么?

ANone
B100
C报错 KeyError
D0
3判断题

在 Python 字典中,键可以是列表类型。

4填空题
以下代码想遍历字典 person 并输出所有键值对,请补全空缺语句。\nperson = {'name': '小明', 'age': 12, 'city': '北京'}\nfor ___ :\n    print(k, v)
5填空题
以下代码利用字典统计字符串 s 中每个字符出现的次数,请补全空缺语句。\ns = 'hello world'\ncounts = {}\nfor ch in s:\n    ___\nprint(counts)