Python 字典(Dictionary)完全指南:从入门到实战

你好呀!👋 欢迎回到我们的 Python 课堂。上节课我们学习了"上了锁的列表"------元组,今天我们要来学习 Python 中最强大、最常用的数据结构之一:字典(Dictionary)

如果说列表和元组是按"顺序"排队的队伍,那么字典就像是一本真正的字典 或者你的手机通讯录:你不需要知道它排在第几个,你只需要知道它的"名字"(键),就能立刻找到对应的"内容"(值)。

准备好了吗?我们开始今天的课程!👩‍🏫


一、 什么是字典(Dictionary)?

字典是一种可变的容器模型 ,它存储的是 键值对(Key-Value pairs)

  • 外观特征 :使用花括号 {} 包裹,键和值之间用冒号 : 分隔,每对之间用逗号 , 分隔。
  • 核心规则(🌟 必考点)
    1. 键(Key)必须是唯一的:如果同一个键被赋值两次,后面的值会覆盖前面的值。
    2. 键(Key)必须是不可变的 :你可以用字符串、数字或元组 作为键,但绝对不能用列表(因为列表是可变的)。
    3. 值(Value)可以是任何数据类型:数字、字符串、列表,甚至另一个字典都可以。
python 复制代码
# 一个标准的字典实例
student = {
    'name': '小明',       # 键是字符串,值是字符串
    'age': 18,            # 键是字符串,值是整数
    'hobbies': ['篮球', '编程'] # 键是字符串,值是列表
}

(💡 老师提醒:dict 是 Python 的内置关键字,请千万不要把你的变量命名为 dict,比如 dict = {} 是错误的写法,可以用 my_dictinfo 代替。)


二、 如何创建字典?

python 复制代码
# 1. 使用花括号创建
dict1 = {'apple': 5, 'banana': 3}

# 2. 创建空字典(两种方法)
empty_dict1 = {}
empty_dict2 = dict()

# 3. 使用 dict() 构造函数(适合从成对的数据中创建)
dict2 = dict(name='Alice', age=25)  # 注意:这里的键不需要加引号
print(dict2)  # 输出: {'name': 'Alice', 'age': 25}

三、 访问字典里的值

方法 1:使用方括号 [](直接,但有风险)

python 复制代码
info = {'name': 'Runoob', 'age': 7}
print(info['name'])  # 输出: Runoob

⚠️ 风险 :如果你访问了一个不存在的键,Python 会直接报错(KeyError),导致程序崩溃。

python 复制代码
# print(info['gender'])  # ❌ 报错:KeyError: 'gender'

方法 2:使用 .get() 方法(🌟 老师强烈推荐的最佳实践)

.get() 方法在找不到键时,不会报错,而是返回 None,或者你指定的默认值。

python 复制代码
print(info.get('age'))          # 输出: 7
print(info.get('gender'))       # 输出: None (程序安全运行)
print(info.get('gender', '未知')) # 输出: 未知 (找不到时返回你设定的默认值)

四、 修改与添加元素

在字典中,修改添加使用的是完全相同的语法。Python 会检查键是否存在:存在就修改,不存在就添加。

python 复制代码
info = {'name': 'Runoob', 'age': 7}

# 1. 修改已存在的键
info['age'] = 8  
print(info)  # 输出: {'name': 'Runoob', 'age': 8}

# 2. 添加新的键值对
info['school'] = '菜鸟教程'
print(info)  # 输出: {'name': 'Runoob', 'age': 8, 'school': '菜鸟教程'}

五、 删除字典元素

根据你想删除的范围,有 4 种不同的方法:

python 复制代码
d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}

# 1. del 语句:删除指定的键值对
del d['a']
print(d)  # 输出: {'b': 2, 'c': 3, 'd': 4}

# 2. .pop(key):删除指定键,并【返回】被删除的值(非常实用)
removed_value = d.pop('b')
print(removed_value)  # 输出: 2
print(d)              # 输出: {'c': 3, 'd': 4}

# 3. .popitem():删除并返回【最后一对】键值对 (Python 3.7+ 保证删除最后插入的)
last_item = d.popitem()
print(last_item)  # 输出: ('d', 4)

# 4. .clear():清空字典所有内容,但保留字典本身
d.clear()
print(d)  # 输出: {}

六、 字典的遍历(🌟 核心实战技能)

在实际开发中,我们经常需要把字典里的内容全部打印或处理一遍。字典提供了三个视图方法:.keys(), .values(), .items()

python 复制代码
user = {'name': 'Alice', 'age': 25, 'city': 'Beijing'}

# 1. 遍历所有的键 (默认行为,等同于 user.keys())
for key in user:
    print(key, end=" ")  
# 输出: name age city

# 2. 遍历所有的值
for value in user.values():
    print(value, end=" ")
# 输出: Alice 25 Beijing

# 3. 🌟 同时遍历键和值 (最常用!使用 .items())
for key, value in user.items():
    print(f"键是: {key}, 值是: {value}")
# 输出: 
# 键是: name, 值是: Alice
# 键是: age, 值是: 25
# 键是: city, 值是: Beijing

七、 🎁 老师的加分项:字典的高级技巧

1. 为什么列表不能做键,但元组可以?

回顾我们上节课学的:字典的键必须是不可变的(哈希的)。

python 复制代码
# ✅ 正确:元组是不可变的,可以做键
location = {(39.9, 116.4): "北京"} 

# ❌ 错误:列表是可变的,做键会报错
# bad_location = {[39.9, 116.4]: "北京"}  # TypeError: unhashable type: 'list'

2. .setdefault() 方法:优雅地初始化

如果你想统计单词出现的次数,传统的写法需要判断键是否存在。用 .setdefault() 可以一行搞定:

python 复制代码
word_count = {}
word = "apple"

# 如果 "apple" 不在字典里,就设为 0,然后 +1
word_count[word] = word_count.setdefault(word, 0) + 1
print(word_count)  # 输出: {'apple': 1}

八、 📝 课后小练习(巩固时间!)

请打开你的 Python 编辑器,尝试完成以下 3 个小任务。遇到报错不要怕,读懂报错信息是程序员的第一步!

  1. 创建与访问 :创建一个字典 book,包含书名('title')、作者('author')和价格('price')。尝试用 .get() 方法获取 'publisher'(出版社),如果不存在,让它返回 "暂无信息"。
  2. 安全修改 :尝试把 book 的价格打 8 折(即原价格乘以 0.8),然后添加一个新的键值对 'is_on_sale': True。
  3. 遍历挑战 :使用 .items() 遍历 book 字典,打印出类似这样的格式:属性: title, 内容: Python基础教程

结语

字典是 Python 赋予我们的"魔法书",它让数据的组织变得极其直观和高效。掌握了字典的增删改查和遍历,你就已经具备了处理大部分现实世界数据(比如 JSON 数据、配置文件)的能力。

去试试课后练习吧!如果有任何一行代码不理解,或者运行结果和你想象的不一样,随时带着代码来问我。老师随时在这里为你解答!🚀

相关推荐
foggyprojects1 小时前
在 DeepSeek Harness 里跑通 Foggy:从安装插件到第一次问数
后端
不甘先生1 小时前
Go 中 type、方法与指针接收者:从 str_name.Name() 看懂 Go 的类型系统
开发语言·后端·golang
摇滚侠3 小时前
《SpringBoot 3:入门与应用实战》第 14 章 打包与部署 Spring Boot 应用打包 阅读笔记 41
spring boot·笔记·后端
阿拉斯攀登4 小时前
MQ消息积压问题排查:消费卡顿、堆积、消费速度优化
后端
阿拉斯攀登4 小时前
无人售货机库存异步更新方案:解决高并发下单库存卡顿问题
后端
阿拉斯攀登4 小时前
无人售货机MQ消息丢失、重复消费、超时异常全套兜底方案
后端
做系统的大强4 小时前
我用中文从零写了一个操作系统(下篇):从45个BUG到165个——假持久化、USB地狱与OS自举
后端
程序员老赵4 小时前
Docker 部署 Rocky Linux:轻松搭建 RHEL 兼容企业级基础镜像平台
linux·后端·docker
用户6152612132104 小时前
Java主流框架与源码:Spring Framework
后端