字典
您需要高效学习,找工作? 点击咨询 报名实战班
点击查看学员就业情况
字典是什么
目前为止,Python中最常用的数据类型,我们只剩下一个 字典
还没有给大家介绍了。
字典,是Python开发中非常重要的一种数据类型。
为什么呢? 因为字典 提供了一种特别的结构, 就是 存放 键值对
数据。这种结构使得字典,特别像 一张 表
什么是键值对数据?
举个例子, 一个游戏系统 里面会存储 用户信息。
系统 经常需要 查询某个用户的信息,比如 某个用户的等级、装备等。
那么根据什么去查找该用户的信息呢? 根据 唯一标志 该用户的属性,比如 用户登录名 或者 用户分配的ID号 等。
根据 登录名1 就查到 用户1 的信息
根据 登录名2 就查到 用户2 的信息
这样就形成了如下 的一种 从 登录名 到 用户信息数据 的映射关系
上图中
登录名1就是键(英文叫Key), 用户1 就是值(英文叫Value);
登录名2就是键, 用户2就是值。
每个对应的帐号 和 会员数据 就形成了一个键值对。
要存储像这样 一对一 的映射关系的数据结构,就像一张表一样,在Python中就可以使用字典这种数据类型。
字典的定义
字典对象定义用花括号 {}
, 字典里面的 每个元素之间用 逗号
隔开。
每个元素都是一个键值对,键和值之间用 冒号
隔开。
上面例子中,如果每个帐号的信息比较简单,比如只有等级信息,就定义成这样
上面的字典对象 键就是帐号,值就是一个数字对象,表示等级的数字。
注意,字典元素的 键
必须是 可进行哈希值计算 的对象, 通常是 数字 或者 字符串。
而 字典元素的 值
可以是任何类型的 对象,包括 数字、字符串、列表、元组、字典、自定义类型 等等均可。
Note
什么是 哈希值计算? 大家可以大体理解为 一种算法,可以根据一个原始数据,计算出一个结果数据,而且不同的原始数据,哪怕只有一丁点的不同,计算出的结果数据都不同。
上例中,用户账号信息,如果复杂一些,包括 等级、点卡数,可以是这样的
members = {
'account1' : {'account':'account1', 'level': 13, 'point':3000} ,
'account2' : {'account':'account2', 'level': 12, 'point':36000}
}
上面的字典对象 键就是帐号,值也是一个字典对象。 这个值字典对象中又 包含了 帐号、等级、积分信息。
字典对象的一个特点就是 : 根据 键 去查找 值
非常的方便高效,
比如 members['account1']
就可以得到 键为 'account1' 的 元素的值
最后一句代码打印出的结果就是 13
字典对象可以存储非常多的元素。理论上 只要内存够大,字典的元素的数量是没有限制的。
字典对象 存储元素有特别的优化, 根据 键 查找值的效率非常高,速度非常快,特别适合查找数据这样的操作。
字典对象的键是唯一的,不可能有两个元素具有相同的键。如果我们这样定义一个字典对象
就会发现输出的结果是
相同的键,后面的元素会替换前面的元素。
根据键去获取值,是这样的语法 var[key]
。
如果给出的 key
在 var
这个字典中不存在就会报错了。
比如
就会出现这样的错误,说明key不存在添加、修改、删除
像列表对象一样,字典对象的内容是 可以改变 的。
我们可以这样定义一个空字典
要在字典对象中添加元素非常简单,像这样
members 的内容就变成了
继续添加元素
members 的内容就变成了
如果我们要修改一个元素key对应的value为另外的值,也是这样
大家可以发现:
像这样的赋值语句
括号里面的key:
-
如果在字典中不存在,就是添加元素的的操作,
-
如果已经存在,就是重新赋值操作。 因为字典不允许有相同的key
如果我们要删除一个元素,可以使用字典对象的pop方法。 像这样
members = {
'account1' : 13 ,
'account2' : 12
}
val = members.pop('account1')
print(members)
print(val)
pop方法还会返回参数 key
对应的 value
对象,所以上面的代码执行后,变量val 的值就是 13
而members 的内容则变成了
也可以使用 del 关键字来删除一个元素,比如
判断字典是否存在某个key
有时候,我们要检查字典的key中,是否有我们要找的元素,可以通过 in 这个关键字 ,比如
而 not in 则判断是否不存在,比如
具体的例子如下:
members = {
'account1' : 13 ,
'account2' : 12
}
if 'account1' in members:
print('account1 在字典中存在')
if 'account88' not in members:
print('account88 不在字典中')
访问字典的所有元素
我们有时需要访问字典的每一个元素,也叫遍历字典。
比如,我们需要打印出下面 会员信息字典 中的 每个会员的等级。怎么办?
通常我们使用字典对象的items方法,像这样:
members = {
'account1' : 13 ,
'account2' : 12 ,
'account3' : 15 ,
}
for account,level in members.items():
print (f'account:{account}, level:{level}')
items方法,返回的是一个类似列表一样的对象,其中每个元素就是 键值组成的元组
上面的字典,其items方法返回的是类似这样的对象
用for 循环, account level 两个变量就依次对应其中的每个元组里面的 两个元素,完成遍历。
其他常用方法
得到所有的 key 和value 对象
前面我们介绍了 items
方法, 返回的是 将字典 所有的 键值对元组 存入的 一个类似列表的对象
比如:
返回的是类似这样的对象
而字典还有 keys
方法, 返回的是 将字典 所有的 键
存入的 一个类似列表的对象
比如:
返回的是类似这样的对象
而字典还有 values
方法, 返回的是 将字典 所有的 值
存入的 一个类似列表的对象
比如:
返回的是类似这样的对象
清空字典
clear 方法可以清空字典对象里面的所有元素
比如
可能有的朋友就想,我们给字典对象重新赋值不也就等于清空字典吗?
比如
这两种做法,虽然最后 members 变量指向的对象 都是一个空字典。 但是最大的区别就在于
clear方法, members 变量 指向的还是原来的字典对象。
而 重新赋值的方法, members 变量 指向的 就是一个新的空字典对象。 原来的字典对象呢? 因为没有被引用,就会被Python解释器在合适的时候 从内存中清除掉。
和另外一个字典合并
有的时候,我们需要把字典里面加上另外一个字典的内容, 可以使用update方法,比如
members = {
'account1' : 13 ,
'account2' : 12 ,
'account3' : 15 ,
}
another = {
'account4' : 13 ,
'account5' : 12 ,
}
members.update(another)
print(members)
这样,就在 members字典里面加上了 another字典里面的所有元素。
得到字典元素的个数
如果需要得到字典元素的个数,就使用Python的内置函数 len 即可
比如
members = {
'account1' : 13 ,
'account2' : 12 ,
'account3' : 15 ,
}
print(len(members)) # 结果为3,表示字典中有3个元素