Bootstrap

Python字典的操作小技巧——索引、增添、删除、修改与取键和值

字典是非常常用的一种数据结构,它与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}

三、字典元素的删除

关于字典元素的删除可以使用poppopitemclear三种“方法”实现。

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,'性别':'男','子女':{'儿子':'张四','女儿':'张美'},'兴趣':['踢球','游泳','唱歌']}
# 将年龄改为35
dict1.update({'年龄':35})
print(dict1)

结果:

{'姓名': '张三', '年龄': 35, '性别': '男', '子女': {'儿子': '张四', '女儿': '张美'}, '兴趣': ['踢球', '游泳', '唱歌']}

4.2 键索引

dict1 = {'姓名':'张三','年龄':33,'性别':'男','子女':{'儿子':'张四','女儿':'张美'},'兴趣':['踢球','游泳','唱歌']}
# 将年龄改为35
dict1['年龄'] = 35
print(dict1)
# 将兴趣中的唱歌改为跳舞
dict1['兴趣'][2] = '跳舞'
print(dict1)

结果:

{'姓名': '张三', '年龄': 35, '性别': '男', '子女': {'儿子': '张四', '女儿': '张美'}, '兴趣': ['踢球', '游泳', '唱歌']}
{'姓名': '张三', '年龄': 35, '性别': '男', '子女': {'儿子': '张四', '女儿': '张美'}, '兴趣': ['踢球', '游泳', '跳舞']}

五、取出字典的键、值、键值对的方法

keysvaluesitems方法分别取出字典中的所有键值对
例如:

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方法则不会报错,也就不会影响其他脚本的正常执行。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;