3.【Python编程】字典Dict相关知识及基本操作
备注: 本教程主要使用Python3.6在jupyter notebook上编程实现。Python环境配置参考《【Python学习】Windows10开始你的Anaconda安装与Python环境管理》或者《【Python学习】纯终端命令开始你的Anaconda安装与Python环境管理》。
3.1 字典的创建
字典是一种可变容器模型,且可存储任意类型对象。
字典的每个键值 key=>value 对用冒号 : 分割,每个对之间用逗号(,)分割,整个字典包括在花括号 {} 中 ,格式如下所示
d = {key1 : value1, key2 : value2, key3 : value3 }
字典值可以是任何的python对象,既可以是标准的对象,也可以是用户定义的,但键不行。
两个重要的点需要记住:
- 不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住;
- 键必须不可变,所以可以用数字,字符串或元组充当,而用列表就不行。
注意:dict作为Python的关键字和内置函数,变量名不能命名为dict。
dict1 = {'姓名': '韦小宝', '性别': '男', '年龄': 30, '学校': '华南理工大学'}
print("dict1=",dict1)
dict1= {'姓名': '韦小宝', '性别': '男', '年龄': 30, '学校': '华南理工大学'}
# 使用大括号{}来创建空字典
empty_dict = {}
print("empty_dict=",empty_dict)
empty_dict= {}
3.2 访问字典里的值
print("dict1['姓名']: ", dict1['姓名'])
dict1['姓名']: 韦小宝
3.3 修改字典
print("dict1=",dict1)
dict1['年龄'] = 31 # 更新年龄
dict1['籍贯'] = "广东省广州市" # 添加信息
print("dict1=",dict1)
dict1= {'姓名': '韦小宝', '性别': '男', '年龄': 30, '学校': '华南理工大学'}
dict1= {'姓名': '韦小宝', '性别': '男', '年龄': 31, '学校': '华南理工大学', '籍贯': '广东省广州市'}
3.4 删除字典元素
del dict1['籍贯']
print("dict1=",dict1)
dict1= {'姓名': '韦小宝', '性别': '男', '年龄': 31, '学校': '华南理工大学'}
3.5 字典的常用函数
len(dict):计算字典元素个数,即键的总数
print("len(dict1)=",len(dict1))
len(dict1)= 4
str(dict): 输出字典,可以打印的字符串表示
print("str(dict1)=",str(dict1))
print(dict1)
str(dict1)= {'姓名': '韦小宝', '性别': '男', '年龄': 31, '学校': '华南理工大学'}
{'姓名': '韦小宝', '性别': '男', '年龄': 31, '学校': '华南理工大学'}
dict.fromkeys(seq[, value])
用于创建一个新字典,以序列 seq 中元素做字典的键,value 为字典所有键对应的初始值。
seq = ('姓名', '性别', '年龄')
dict2 = dict.fromkeys(seq) # 默认所有值为None
print("新的字典为 : %s" %str(dict2))
dict3 = dict.fromkeys(seq, 10)
print("新的字典为 : %s" %str(dict3))
新的字典为 : {'姓名': None, '性别': None, '年龄': None}
新的字典为 : {'姓名': 10, '性别': 10, '年龄': 10}
dict.get(key, default=None): 返回指定键的值
- key – 字典中要查找的键
- default – 如果指定的键不存在时,返回该默认值
print("年龄为 : %s" %dict1.get('年龄'))
年龄为 : 31
dict.items(): 以列表返回视图对象,是一个可遍历的key/value 对。
dict.keys()、dict.values()与dict.items()类似。
print(dict1.items())
print(dict1.keys())
print(dict1.values())
dict_items([('姓名', '韦小宝'), ('性别', '男'), ('年龄', 31), ('学校', '华南理工大学')])
dict_keys(['姓名', '性别', '年龄', '学校'])
dict_values(['韦小宝', '男', 31, '华南理工大学'])
# 遍历列表
for k,v in dict1.items():
print(k, ": ", v)
姓名 : 韦小宝
性别 : 男
年龄 : 31
学校 : 华南理工大学
# 将字典的 key 和 value 提取出来,存储到两个列表中
# 法1
key = []
value = []
for k,v in dict1.items():
key.append(k)
value.append(v)
print(key)
print(value)
# 法2
key = list(dict1.keys())
value = list(dict1.values())
print(key)
print(value)
['姓名', '性别', '年龄', '学校']
['韦小宝', '男', 31, '华南理工大学']
['姓名', '性别', '年龄', '学校']
['韦小宝', '男', 31, '华南理工大学']
dict.update(dict2): 把字典参数 dict2 的 key/value(键/值) 对更新到字典 dict 里。
print ("更新前的字典dict1=", dict1)
temp_dict = {'年龄':31,'班级':'卓越班'}
dict1.update(temp_dict)
print ("更新后的字典dict1=", dict1)
更新前的字典dict1= {'姓名': '韦小宝', '性别': '男', '年龄': 31, '学校': '华南理工大学'}
更新后的字典dict1= {'姓名': '韦小宝', '性别': '男', '年龄': 31, '学校': '华南理工大学', '班级': '卓越班'}
pop(key[,default]): 删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。
print ("pop前的字典dict1=", dict1)
print(dict1.pop('班级'))
print ("pop后的字典dict1=", dict1)
pop前的字典dict1= {'姓名': '韦小宝', '性别': '男', '年龄': 31, '学校': '华南理工大学', '班级': '卓越班'}
卓越班
pop后的字典dict1= {'姓名': '韦小宝', '性别': '男', '年龄': 31, '学校': '华南理工大学'}
# 逐个pop字典的键值对
dict1 = {'姓名': '韦小宝', '性别': '男', '年龄': 30, '学校': '华南理工大学'}
print("dict1=",dict1)
for k in list(dict1.keys()):
print(dict1.pop(k))
print(dict1)
dict1= {'姓名': '韦小宝', '性别': '男', '年龄': 30, '学校': '华南理工大学'}
韦小宝
男
30
华南理工大学
{}
in 操作符用于判断键是否存在于字典中,如果键在字典 dict 里返回 true,否则返回 false。
# 检测键 '姓名' 是否存在
dict1 = {'姓名': '韦小宝', '性别': '男', '年龄': 30, '学校': '华南理工大学'}
if '姓名' in dict1:
print("键 \'姓名\' 存在")
else :
print("键 \'姓名\' 不存在")
键 '姓名' 存在
copy与deepcopy
- 直接赋值:其实就是对象的引用(别名)。
- 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。
- 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。
from copy import deepcopy
dict1 = {'姓名': '韦小宝', '性别': '男', '年龄': 30, '学校': '华南理工大学','分数':[100,90,80]}
dict2 = dict1 # 浅拷贝: 引用对象
dict3 = dict1.copy() # 浅拷贝:深拷贝父对象(一级目录),子对象(二级目录)不拷贝,子对象是引用
dict4 = deepcopy(dict1) # 深拷贝
# 修改 data 数据
dict1['年龄']=40
dict1['分数'].remove(100)
# 输出结果
print('dict1=', dict1)
print('dict2=', dict2) # 与dict1一样
print('dict3=', dict3) # 与dict1不完全一样,修改dict1的值的不可变数据类型(字符串、数字、元组),不影响dict3,
# 修改dict1的值的可变数据类型(列表、字典、集合),会影响dict3
print('dict4=', dict4) # 不受dict1影响
dict1= {'姓名': '韦小宝', '性别': '男', '年龄': 40, '学校': '华南理工大学', '分数': [90, 80]}
dict2= {'姓名': '韦小宝', '性别': '男', '年龄': 40, '学校': '华南理工大学', '分数': [90, 80]}
dict3= {'姓名': '韦小宝', '性别': '男', '年龄': 30, '学校': '华南理工大学', '分数': [90, 80]}
dict4= {'姓名': '韦小宝', '性别': '男', '年龄': 30, '学校': '华南理工大学', '分数': [100, 90, 80]}