字典是非常常用的一种数据结构,它与json格式的数据非常相似,核心就是以键值对的形式存储数据,关于Python中的字典做如下四点说明:
构造字典对象需要使用大括号表示,即{},每一个字典元素都是以键值对的形式存在,并且键值对之间用英文状态下的冒号隔开,即key:value。键在字典中是唯一的,不能有重复,对于字符型的键需要用引号引起来。值可以是单个值,也可以是多个值构成的列表、元组或字典。字典不再是序列,无法通过位置索引完成元素值的获取,只能通过键索引实现。字典与列表一样,都是可变类型的数据结构。
接下来介绍字典的可变性。关于可变性,仍然是对字典元素进行增加、删除和修改的操作,这些操作都可以通过字典的“方法”实现,下面将依次介绍字典的各个操作。
一、字典的索引/取值
首先介绍字典的键索引如何实现元素值的获取,举例如下:
dict1 = {'姓名':'张三','年龄':33,'性别':'男','子女':{'儿子':'张四','女儿':'张美'},'兴趣':['踢球','游泳','唱歌']}# 打印字典print(dict1)# 打印年龄对应的值print(dict1['年龄'])# 打印性别对应的值print(dict1.get('性别'))# 打印子女中的儿子姓名print(dict1['子女']['儿子'])# 打印兴趣中的游泳print(dict1['兴趣'][1])
结果:
{'姓名': '张三', '年龄': 33, '性别': '男', '子女': {'儿子': '张四', '女儿': '张美'}, '兴趣': ['踢球', '游泳', '唱歌']}33男张四游泳
对于字典来说,它不再是序列,要想获取元素值,只能在索引里面写入具体的键;
在字典dict1中,键“子女”对应的值是另一个字典,属于dict1的嵌套字典,所以需要通过双层键索引获取张三儿子的姓名;键“兴趣”对应的值是列表,所以“游泳”这个值只能通过先锁定字典的键再锁定列表元素的位置才能获得。
二、字典元素的增加
针对字典元素的增加,可以使用如下三种方式实现,分别是setdefault方法、update方法和键索引方法。
2.1 setdefault
setdefault方法接受两个参数,第一个参数为字典的键,第二个参数是键对应的值。
例如:
dict1 = {'姓名':'张三','年龄':33,'性别':'男','子女':{'儿子':'张四','女儿':'张美'},'兴趣':['踢球','游泳','唱歌']}# 往字典dict1中增加户籍信息dict1.setdefault('户籍','合肥')print(dict1)
结果:
{'姓名': '张三', '年龄': 33, '性别': '男', '子女': {'儿子': '张四', '女儿': '张美'}, '兴趣': ['踢球', '游泳', '唱歌'], '户籍': '合肥'}
2.2 update
update从字面理解是对字典的更新,关于update方法完成字典元素的修改可参见后面的内容,除此,它还可以增加元素,与setdefault不同的是该方法接受的是一个字典对象。
例如:
dict1 = {'姓名':'张三','年龄':33,'性别':'男','子女':{'儿子':'张四','女儿':'张美'},'兴趣':['踢球','游泳','唱歌']}# 增加学历信息dict1.update({'学历':'硕士'})print(dict1)
结果:
{'姓名': '张三', '年龄': 33, '性别': '男', '子女': {'儿子': '张四', '女儿': '张美'}, '兴趣': ['踢球', '游泳', '唱歌'], '学历': '硕士'}
2.3 键索引方法
第三种方法是通过键索引实现的,如果原字典中没有指定的键,就往字典中增加元素,否则,起到修改字典元素的功能。
例如:
{'姓名': '张三', '年龄': 33, '性别': '男', '子女': {'儿子': '张四', '女儿': '张美'}, '兴趣': ['踢球', '游泳', '唱歌'], '身高': 178}
结果:
{'姓名': '张三', '年龄': 33, '性别': '男', '子女': {'儿子': '张四', '女儿': '张美'}, '兴趣': ['踢球', '游泳', '唱歌'], '身高': 178}
三、字典元素的删除
关于字典元素的删除可以使用pop、popitem和clear三种“方法”实现。
3.1 pop
pop方法在列表中同样起到删除元素的作用,如果不传递任何值给pop方法,则表示删除列表末尾的一个元素,否则就是删除指定下标的一个元素,但是在字典中pop方法必须指定需要删除的键,否则就会引起语法错误;如果需要删除嵌套字典中的某个键,就必须先通过键索引取出对应的字典,然后使用pop方法完成嵌套字典元素的删除。
例如:
dict1 = {'姓名':'张三','年龄':33,'性别':'男','子女':{'儿子':'张四','女儿':'张美'},'兴趣':['踢球','游泳','唱歌']}# 删除字典中的户籍信息dict1.pop('性别')print(dict1)# 删除嵌套字典中女儿的姓名dict1['子女'].pop('女儿')print(dict1)
结果:
{'姓名': '张三', '年龄': 33, '子女': {'儿子': '张四', '女儿': '张美'}, '兴趣': ['踢球', '游泳', '唱歌']}{'姓名': '张三', '年龄': 33, '子女': {'儿子': '张四'}, '兴趣': ['踢球', '游泳', '唱歌']}
3.2 popitem
popitem方法不需要传递任何值,它的功能就是任意删除字典中的某个元素。
一般会删除最后一个元素。所以这个方法使用较少。
例如:
dict1 = {'姓名':'张三','年龄':33,'性别':'男','子女':{'儿子':'张四','女儿':'张美'},'兴趣':['踢球','游泳','唱歌']}# 删除字典中的任意一个元素dict1.popitem()print(dict1)
结果:
{'姓名': '张三', '年龄': 33, '性别': '男', '子女': {'儿子': '张四', '女儿': '张美'}}
3.3 clear
clear方法则可以干净利落地清空字典中的所有元素.
例如:
dict1 = {'姓名':'张三','年龄':33,'性别':'男','子女':{'儿子':'张四','女儿':'张美'},'兴趣':['踢球','游泳','唱歌']}# 清空字典元素dict1.clear()print(dict1)
结果:
{}
四、字典元素的修改
正如“字典元素的增加”部分所提到的,也可以使用update方法和键索引方法完成字典元素的修改,具体如下面的例子所示。
需要注意的是,如果字典中的值是另一个字典或列表,需要先通过键索引实现字典元素的查询,然后在查询的基础上应用对应的修改方法即可(如update方法或“取而改之”的方法)。
4.1 update
dict1 = {'姓名':'张三','年龄':33,'性别':'男','子女':{'儿子':'张四','女儿':'张美'},'兴趣':['踢球','游泳','唱歌']}# 将年龄改为35dict1.update({'年龄':35})print(dict1)
结果:
{'姓名': '张三', '年龄': 35, '性别': '男', '子女': {'儿子': '张四', '女儿': '张美'}, '兴趣': ['踢球', '游泳', '唱歌']}
4.2 键索引
dict1 = {'姓名':'张三','年龄':33,'性别':'男','子女':{'儿子':'张四','女儿':'张美'},'兴趣':['踢球','游泳','唱歌']}# 将年龄改为35dict1['年龄'] = 35print(dict1)# 将兴趣中的唱歌改为跳舞dict1['兴趣'][2] = '跳舞'print(dict1)
结果:
{'姓名': '张三', '年龄': 35, '性别': '男', '子女': {'儿子': '张四', '女儿': '张美'}, '兴趣': ['踢球', '游泳', '唱歌']}{'姓名': '张三', '年龄': 35, '性别': '男', '子女': {'儿子': '张四', '女儿': '张美'}, '兴趣': ['踢球', '游泳', '跳舞']}
五、取出字典的键、值、键值对的方法
keys、values和items方法分别取出字典中的所有键、值和键值对。
例如:
dict2 = {'电影':['三傻大闹宝莱坞','大话西游之大圣娶亲','疯狂动物城'],'导演':['拉吉库马尔·希拉尼','刘镇伟','拜伦·霍华德 '],'评分':[9.1,9.2,9.2]}# 取出键'评分'所对应的值print(dict2.get('评分'))# 取出字典中的所有键print(dict2.keys())# 取出字典中的所有值print(dict2.values())# 取出字典中的所有键值对print(dict2.items())
结果:
[9.1, 9.2, 9.2]dict_keys(['电影', '导演', '评分'])dict_values([['三傻大闹宝莱坞', '大话西游之大圣娶亲', '疯狂动物城'], ['拉吉库马尔·希拉尼', '刘镇伟', '拜伦·霍华德 '], [9.1, 9.2, 9.2]])dict_items([('电影', ['三傻大闹宝莱坞', '大话西游之大圣娶亲', '疯狂动物城']), ('导演', ['拉吉库马尔·希拉尼', '刘镇伟', '拜伦·霍华德 ']), ('评分', [9.1, 9.2, 9.2])])
【Note】:
get方法的功能与键索引已知,可以从字典中取出键对应的值。所不同的是,如果某个键在字典中不存在,应用键索引的方法会产生“键错误”的信息;而get方法则不会报错,也就不会影响其他脚本的正常执行。