前面我们学了列表和元组。
它们都很有用,但有一个明显的问题:
它们更适合存一排数据,不太适合表达现实世界里的信息。
比如现在要表示一个学生的信息。
你当然可以这么写:
student = ['张三', 18, '男', 95]
这行代码能跑,也能存数据,但看着总觉得不踏实。
因为你得靠位置去猜:
第 0 个是姓名 第 1 个是年龄 第 2 个是性别 第 3 个是分数
今天你还记得,明天代码一长,自己都可能看晕。别人接手时更是要靠猜。
现实世界的数据,往往不是一排摆着的,而是一个个字段组成的。
姓名 对应 张三 年龄 对应 18 性别 对应 男 分数 对应 95
这种一一对应的关系,就是字典最擅长表达的东西。
所以你会发现,列表更像排队站好的人,字典更像填完整的一张信息表。
而真正接近现实项目的数据结构,往往就是字典。
一、什么是字典
字典是一种用来存储键值对的数据类型。
什么叫键值对?
简单说就是:
一个名字,对应一个值 一个标识,对应一个内容
比如:
student = {'name': '张三','age': 18,'gender': '男','score': 95}
这里:
name 是键张三 是值
age 是键18 是值
它的结构不是靠位置记数据,而是靠名字找数据。
这就非常符合人的思维方式。
你不会说:
把第 2 个信息拿给我
你会说:
把年龄给我看看
这就是字典的核心价值。
二、字典长什么样
字典用大括号表示:
person = {'name': '小王', 'age': 20}
最基本的格式是:
{键1: 值1, 键2: 值2, 键3: 值3}
注意几个细节:
字典外层是大括号 每一组数据用冒号连接 多组数据之间用逗号分隔
看一个更完整的例子:
book = {'title': 'Python 入门','author': '老李','price': 59.9}print(book)print(type(book))
输出:
{'title': 'Python 入门', 'author': '老李', 'price': 59.9}<class 'dict'>
dict 就是字典类型。
三、为什么说字典更像现实世界
这一点非常关键。
你以后学接口、爬虫、配置文件、前后端数据交互,都会频繁碰到字典。原因很简单:
现实里的信息,本来就不是一排数字,而是一组字段。
比如用户信息:
user = {'username': 'tom','password': '123456','email': 'tom@example.com'}
比如商品信息:
product = {'name': '机械键盘','price': 299,'stock': 120}
比如天气信息:
weather = {'city': '杭州','temp': 26,'type': '晴'}
你会发现,这些数据如果用列表来存,虽然也能存,但完全不直观。
而用字典,几乎一眼就能看懂。
所以字典的重要性,不只是语法层面,更是因为它更接近真实业务数据的样子。
四、字典中的键和值,到底是什么
字典里每一组数据都叫一个键值对。
格式是:
键: 值
键可以理解成标签、字段名、名称。 值就是这个标签对应的具体内容。
比如:
student = {'name': '张三','age': 18}
这里:
name 是标签张三 是内容
age 是标签18 是内容
你可以把字典想成一个带标签的盒子。 每个盒子外面都贴了名字,找东西时不是靠挨个数位置,而是直接按标签找。
这和列表差别很大。
列表是:
第几个位置放了什么
字典是:
某个名字对应什么值
这就是两种完全不同的组织方式。
五、如何取出字典里的值
字典最常见的操作,就是通过键来取值。
看代码:
student = {'name': '张三','age': 18,'score': 95}print(student['name'])print(student['age'])
输出:
张三18
你会发现,字典不是用索引取值,而是用键取值。
列表这样取:
students[0]
字典这样取:
student['name']
一个靠位置,一个靠名称。
后者明显更贴近现实。
六、字典为什么不支持索引
很多新手刚学字典时,最容易犯的错就是想当然地写成这样:
student = {'name': '张三','age': 18}print(student[0])
这会报错。
为什么?
因为字典不是按顺序编号来存数据的,它的核心思想不是第几个,而是谁对应谁。
也就是说,字典关心的是:
有没有这个键
而不是:
它排在第几个
所以你取值时,必须写对键名。
print(student['name'])
这是对的。
print(student[0])
这是错的。
这个思维一定要尽快切换过来,不然学字典会一直别扭。
七、空字典怎么写
定义空字典有两种常见方式。
第一种:
data = {}
第二种:
data = dict()
这两种都可以。
比如:
a = {}b = dict()print(type(a))print(type(b))
输出:
<class 'dict'><class 'dict'>
以后你在项目里两种写法都能看到。 新手阶段直接记 {} 就够了,写起来更直观。
八、字典里的值可以是什么类型
字典的值非常灵活,几乎可以是任何类型。
比如字符串、整数、浮点数、布尔值、列表,甚至另一个字典都可以。
看例子:
user = {'name': '小李','age': 22,'vip': True,'scores': [88, 92, 95],'address': {'city': '上海','area': '浦东' }}print(user)
这说明字典特别适合表示复杂信息。
一个用户,不只是有名字和年龄,还可能有成绩、地址、订单、偏好设置。 这些都可以继续往里面装。
所以你会发现,字典不是只能存简单数据,它更像一个小型信息仓库。
九、字典里的键有什么要求
这部分要稍微认真一点,因为它涉及规则。
字典的键必须是不可变类型。
你现在先记常见结论就够了:
字符串可以当键 数字可以当键 元组通常也可以当键 列表不能当键
最常见的键,就是字符串。
比如:
student = {'name': '张三','age': 18}
这是最标准、最常见的写法。
为什么列表不能做键?
因为列表是可变的,而字典需要一个稳定、不乱变的键,才能快速找到对应值。
这个底层原理后面学到更深时你会明白。现阶段只要记住:
键要稳定 值可以灵活
就够了。
十、字典的键不能重复
这是字典一个非常重要的特点。
看代码:
student = {'name': '张三','age': 18,'name': '李四'}print(student)
输出:
{'name': '李四', 'age': 18}
你会发现,前面的 name: 张三 被后面的 name: 李四 覆盖了。
因为字典里,键必须唯一。
这也很好理解。
一张表里,字段名如果都叫一个名字,那程序就分不清你到底想取哪个。
所以:
键不能重复 值可以重复
比如下面这样是可以的:
data = {'a': 100,'b': 100,'c': 100}
不同的键,对应相同的值,没问题。
十一、字典是无序的吗
这个问题你可能会在不同教程里看到不同说法。
更准确一点地说:
字典不是靠索引取值的容器 但在现代 Python 里,它会保留插入顺序
也就是说:
data = {'name': '张三','age': 18,'city': '北京'}print(data)
打印出来时,通常就是你写进去的顺序。
但你不要因此把字典当列表用。 它的本质仍然是键值映射,不是按位置操作的序列。
这一点只要心里有数就行,别死抠概念。对新手最重要的是:
字典用键找值,不用位置找值。
十二、用字典表示一条完整信息,真的很舒服
来看一个对比。
如果用列表表示一本书:
book = ['Python 核心', '老周', 79.9, 300]
请问:
哪一个是价格 哪一个是页数 哪一个是作者
虽然你能记住,但很费脑子。
再看字典写法:
book = {'title': 'Python 核心','author': '老周','price': 79.9,'pages': 300}
这就舒服多了。
以后你写代码时,一个非常重要的判断标准就是:
当前这组数据,如果不用注释就看不懂,那很可能应该考虑字典。
因为字典天生自带说明性。
十三、字典的典型场景有哪些
你现在可能还没进项目,但提前建立场景感很有必要。
下面这些地方,字典特别常见。
1. 存用户信息
user = {'username': 'admin','password': '123456'}
2. 存配置参数
config = {'host': '127.0.0.1','port': 3306,'user': 'root'}
3. 存商品信息
product = {'name': '显示器','price': 899,'brand': 'AOC'}
4. 存接口返回数据
很多接口返回的内容,本质上就是字典。
response = {'code': 200,'msg': 'success','data': {'name': '小明','age': 18 }}
等你后面学爬虫、Web、接口开发时,会发现字典的出场率非常高。
十四、字典和列表到底怎么区分
这也是新手经常问的问题。
记一个简单判断方法:
如果你存的是一组同类数据,通常用列表 如果你存的是一个对象的多个属性,通常用字典
比如一组成绩:
scores = [90, 88, 95, 76]
这是一组同类数据,适合列表。
比如一个学生的信息:
student = {'name': '小明','age': 17,'score': 95}
这是一个对象的多个属性,适合字典。
再进一步:
多个学生,往往是列表套字典。
students = [ {'name': '张三', 'age': 18}, {'name': '李四', 'age': 19}, {'name': '王五', 'age': 17}]
这种结构你以后会见得非常多。
外层列表,表示很多条记录 内层字典,表示每条记录的详细字段
这已经非常接近真实项目的数据组织方式了。
十五、字典取值时要小心一个坑
看这段代码:
student = {'name': '张三','age': 18}print(student['score'])
这会报错。
因为 score 这个键根本不存在。
也就是说,字典取值时,你必须保证这个键真的有。
初学阶段你先记住这个现象就行。 后面我们讲字典常见操作时,会专门讲更安全的取值方式。
现在你只需要知道:
取值时,键名必须写对 不存在的键会报错
所以平时写代码时,字段名别写错,别少字母,别自己换名字。
十六、字典也可以嵌套
现实数据往往不是平的,而是一层套一层。
比如一个学生,除了姓名和年龄,还有家庭住址。住址里面还有城市和区县。
这时候就可以嵌套字典。
student = {'name': '张三','age': 18,'address': {'city': '杭州','area': '西湖区' }}print(student['address'])print(student['address']['city'])
输出:
{'city': '杭州', 'area': '西湖区'}杭州
这就是字典特别强的地方:
它不只是能装简单值,还能逐层组织复杂信息。
你可以把它理解成一个抽屉柜。 大抽屉里还能再分小抽屉。
十七、一个非常生活化的理解方式
把字典想成手机通讯录,就很好懂了。
联系人名字,就是键。 对应的手机号,就是值。
比如:
contacts = {'张三': '13800000001','李四': '13800000002','王五': '13800000003'}
你找号码时,不会说给我第 2 个号码。 你会说,把李四的号码给我。
这就是字典的思维:
按名字找内容 不是按位置找内容
如果你能把这一点真正吃透,字典就不再抽象了。
十八、练习题:先把字典用顺手
下面这些小练习,建议你自己敲一遍。
1. 定义一个字典,保存你的姓名、年龄、城市
参考答案:
info = {'name': '小明','age': 20,'city': '苏州'}print(info)
2. 取出姓名和年龄
print(info['name'])print(info['age'])
3. 定义一个商品字典,包含商品名、价格、库存
product = {'name': '鼠标','price': 59.9,'stock': 300}print(product)
4. 定义一个嵌套字典,保存学生和地址信息
student = {'name': '小红','age': 17,'address': {'city': '南京','area': '鼓楼区' }}print(student['address']['city'])
这些练习不复杂,但很关键。 字典这个东西,光看很容易懂,真写的时候最容易错在字段名上。所以一定要自己手敲。
十九、本章小结
这一章最重要的,不是背会 dict 这个单词,而是建立一种新的数据组织思维。
列表解决的是一组数据怎么放。 字典解决的是一条信息怎么表达。
你要记住下面几点:
字典用大括号表示 字典存的是键值对 通过键来取值,不靠索引 键必须唯一 值可以是任意类型 字典特别适合描述现实中的对象信息
如果说列表更像一排数据, 那么字典就是一张带字段的信息表。
而程序一旦开始接近真实业务,字典的重要性就会迅速上升。
下一章我们继续讲 字典的常见操作:增删改查与遍历。 到那一章,你就会真正开始把字典用起来,而不是只会定义、只会看。