Python字典 dict
较难3Python字典:像通讯录一样快速查找信息
同学,你有没有想过用一个名字(比如“小明”)直接找到他的电话号码?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. 字典的两个重要特点
- 键必须是唯一的 —— 就像通讯录里不能有两个叫“小明”的人(如果有,后写的会覆盖先写的)。
- 键必须是不可变的类型 —— 比如字符串、数字、元组都可以做键,但列表、字典不能做键(因为这些可以改变,会扰乱查找)。
值可以是任何类型,甚至可以重复。比如两个人的兴趣都可以是“踢足球”。
新手最容易犯的错误
- 访问不存在的键:直接
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}},可以表示更复杂的数据。
掌握了字典,你就能轻松处理各种“键→值”的对应关系,让程序像你的小助手一样,快速找到你需要的信息。
例题精讲
以下哪个选项能够正确地创建一个非空字典?
已知字典 d = {'x': 10, 'y': 20},执行 d.get('z', 100) 的返回值是什么?
在 Python 字典中,键可以是列表类型。
以下代码想遍历字典 person 并输出所有键值对,请补全空缺语句。\nperson = {'name': '小明', 'age': 12, 'city': '北京'}\nfor ___ :\n print(k, v)以下代码利用字典统计字符串 s 中每个字符出现的次数,请补全空缺语句。\ns = 'hello world'\ncounts = {}\nfor ch in s:\n ___\nprint(counts)