自学Python第11天:字典——我终于能让程序像查字典一样找东西了

自学Python第11天:字典------我终于能让程序像查字典一样找东西了

新手向 | 2026-07-03

前面学过的列表和元组,都是按顺序存数据的。想找到某个数据,得知道它的位置(下标)。

但有些场景不适合用列表。比如我想存一个班级学生的成绩,用列表的话是这样:

python 复制代码
students = ["张三", "李四", "王五"]
scores = [85, 92, 78]

想查张三的成绩,得先找到张三所在列表里的位置,再去成绩列表里找同一个位置的数据,非常麻烦。

今天就来学字典------一种用"名字"来找"值"的数据容器,就像查字典一样方便。

一、字典是什么

想象一下你手机上的通讯录。你不会说"第3个人是谁",而是直接说"张三的电话是多少"。通讯录就是通过"联系人姓名"找到"电话号码"的。

字典就是程序里的通讯录------它用"键"(Key)来查找对应的"值"(Value)。

在Python里,字典用花括号{}表示,每一对数据由"键"和"值"组成,用冒号:连接,多对数据用逗号隔开:

python 复制代码
# 键    值     键    值     键    值
student = {"name": "张三", "age": 18, "city": "北京"}

键是查找的依据,值是要找的数据。

键必须是不可变类型------比如字符串、数字、元组。列表是可变类型,不能作为字典的键(这个坑我们后面会专门讲)。

二、根据键获取值

想拿到字典里的某个值,用字典名:

python 复制代码
student = {"name": "张三", "age": 18, "city": "北京"}
print(student["name"])   # 张三
print(student["age"])    # 18

三、一个我踩过的坑:KeyError

如果访问一个不存在的键,Python会报错:

python 复制代码
student = {"name": "张三", "age": 18}
print(student["city"])

运行后报错:

text 复制代码
KeyError: 'city'

因为字典里没有city这个键,所以找不到。每次访问字典之前,最好确认你用的键是存在的

四、字典的常用操作

1.新增或修改

直接给一个键赋值,如果键不存在,就新增;如果键已存在,就覆盖:

python 复制代码
student = {"name": "张三", "age": 18}

# 新增一个键值对
student["city"] = "北京"
print(student)   # {'name': '张三', 'age': 18, 'city': '北京'}

# 修改已有的键的值
student["age"] = 19
print(student)   # {'name': '张三', 'age': 19, 'city': '北京'}

2.删除:pop()

删除指定的键值对:

python 复制代码
student = {"name": "张三", "age": 18, "city": "北京"}
student.pop("city")
print(student)   # {'name': '张三', 'age': 18}

3.安全取值:get()

用get()方法可以在键不存在时返回一个默认值,而不是报错:

python 复制代码
student = {"name": "张三", "age": 18}
print(student.get("city"))          # None
print(student.get("city", "未知"))   # 未知

4.查看所有键、所有值、所有键值对

python 复制代码
student = {"name": "张三", "age": 18, "city": "北京"}

print(student.keys())      # dict_keys(['name', 'age', 'city'])
print(student.values())    # dict_values(['张三', 18, '北京'])
print(student.items())     # dict_items([('name', '张三'), ('age', 18), ('city', '北京')])

keys()、values()、items() 返回的是视图对象,可以直接用于循环遍历,但不能像列表那样直接按下标访问。如果需要下标访问,可以用 list() 转换后使用,但实际场景中通常直接遍历就够了。

五、遍历字典

1.遍历所有键值对(最常用)

python 复制代码
student = {"name": "张三", "age": 18, "city": "北京"}
for key, value in student.items():
    print(f"{key}: {value}")

运行结果:

text 复制代码
name: 张三
age: 18
city: 北京

2.只遍历键

python 复制代码
for key in student.keys():
    print(key)

3.只遍历值

python 复制代码
for value in student.values():
    print(value)

六、一个我踩过的坑:列表不能作为字典的键

前面提到过,字典的键必须是不可变类型。列表是可变的,所以不能当键:

python 复制代码
# 错误示范
d = {["a", "b"]: "这是列表当键"}   # 报错!

运行后会报 TypeError: unhashable type: 'list'。因为列表的内容可以随时增删改,Python无法保证它稳定可用。

但元组可以作为键,因为元组是不可变的:

python 复制代码
d = {("a", "b"): "这是元组当键"}
print(d[("a", "b")])   # 这是元组当键

七、列表VS字典

场景 推荐用 原因
按编号/顺序存取数据 列表 按位置查找,速度快
按名字/ID查找数据 字典 键值对应,查找方便
数据是一组固定字段 字典 每个字段有名字,代码可读性高
数据需要频繁增删改 列表或字典都可以 两者都支持,看需求

八、综合示例:学生成绩管理系统

把今天学的东西串起来:

python 复制代码
# 用字典存储学生信息
students = {}

while True:
    print("\n--- 学生成绩管理系统 ---")
    print("1. 添加学生")
    print("2. 查看所有学生")
    print("3. 查询学生成绩")
    print("4. 删除学生")
    print("5. 退出")
    
    choice = input("请选择:")
    
    if choice == "1":
        name = input("请输入姓名:")
        score = input("请输入成绩:")
        students[name] = score
        print("添加成功!")
    elif choice == "2":
        if len(students) == 0:
            print("暂无学生数据")
        else:
            for name, score in students.items():
                print(f"{name}:{score}分")
    elif choice == "3":
        name = input("请输入要查询的姓名:")
        score = students.get(name)
        if score is None:
            print("未找到该学生")
        else:
            print(f"{name}的成绩是:{score}分")
    elif choice == "4":
        name = input("请输入要删除的姓名:")
        if name in students:
            students.pop(name)
            print("删除成功!")
        else:
            print("未找到该学生")
    elif choice == "5":
        print("再见!")
        break
    else:
        print("无效选择,请重新输入")

这段代码包含了今天学的:

·字典的定义(students = {})

·新增/修改(studentsname = score)

·查询(students.get(name))

·删除(students.pop(name))

·遍历(for name, score in students.items())

小结

今天学的东西,整理成一张速查表:

知识点 说明 示例
定义字典 用 {} 包裹键值对 d =
取值 通过键获取值 d"name"
新增/修改 键不存在则新增,存在则覆盖 d"age" = 18
get() 安全取值 d.get("city", "未知")
pop() 删除键值对 d.pop("city")
keys() 获取所有键 d.keys()
values() 获取所有值 d.values()
items() 获取所有键值对 d.items()
遍历 循环取出键值对 for k, v in d.items():
键的要求 必须是不可变类型 字符串、数字、元组

什么时候用字典?

·需要根据某个"名字"查找对应的"值"

·存储一条记录的多个字段(如用户信息、商品信息)

·需要快速查找,不关心顺序

下一篇我打算学集合。

如果你也在学Python,欢迎在评论区告诉我你今天学到了什么,或者遇到了什么报错,一起交流!

相关文章: