当前python版本:3.9.7 软件为pycharm专业版,以下的代码以及截图都是来自pycharm软件下运行
学习目录:
字典的用处:
字典的优势:
字典的特性
字典的写法:
字典的增:
增加:
检查式增加(setdefault):
字典的删除:
1、删(pop):
2、删除(del全局都可以用)
3、删除(poitem ):
4、清空(clear)
字典的改:
1、普通修改
2、合并修改
字典查询:
1、查(get):
2、普普通通查询法(与get不同)
字典推导式
关于字典的长度写法:
判断字典中是否有key值
关于字典的循环写法
关于字典的特殊用法:
批量生成字典方法:
copy复制 同列表一样是浅copy
小练习(将多个列表合为一个字典)
字典的用处:
当你的列表数据量大了,你循环列表的时候,速度又慢,还占资源,现在我们可以利用python中自带的字典
字典的优势:
查询速度快,操作方便,不会根据数据量变大从而查询速度变慢
字典的特性
1、key :value结构
2、key必须为不可变数据类型(字符转、数字、元组)不能被修改的类型才能叫key值
3、key 必须是唯一值(不可重复)(重复的会覆盖久的)
4、一个key对应的value可存放任意数据类型,可修改、可不唯一
5、可嵌套,即value值也可以是字典 (可以嵌套列表)
6、 在pyhon3.7之前是无序的(想要有顺序可以用 ordered_dict),从3.7之后开始变得有序
7、查询速度快,且不受字典大小的影响
字典的写法:
普通写法:
staff_list ={
"maliu":[22,"CEO",200000] #前面这个"maliu"就是字典中的key值(索引),可以通过这个去查找内容
"zhangsan":[23,"财务",6000]
#..........
}
dict写法:
a = dict(name='gaoxidong', age=22)
列表式写法:
c = {'ziwojieshao': ['gaoxidong', 22, 'man']}
“name” : [22,'CEO',‘20000’] ##“name”为key值,“value”值为:[22,'CEO',‘20000’]
key值类似我们用的新华字典中的偏旁部首,可以通过关键字眼去快速查询内容
字典的增:
增加:
注意事项:
#如果重复 会覆盖原有的value值 (当你重复对一个key值进行添加,能起到一个修改value的作用,切记key值是固定的无法修改),但是容易误操作将原有的字典改掉
a = dict(a='xiaoming') a['b'] = 'zhangsan' #增 a['c'] = ['wangwu', 23, 4000] #key不可重复 print(a) #显示当前 print(a['b']) #查询字典对应key的value值
运行结果:
检查式增加(setdefault):
注意事项:
#为了避免覆盖原有的value值,那么我们用检查式添加,这个方法的好处,它会自己判断你所添加的key值在不在字典内,如果不在,会添加,如果存在则会显示原有的value值!
写法:
a = dict(name='gaoxidong')
print(a.setdefault('name', 'jack')) #如果key值存在,则返回旧key的value值(如果key:value重复的情况,不会修改原有的)
b = {
'age':23
}
print(b.setdefault('name','gaoxidong'))#创建并返回value值(增)#默认在最后添加
print(a, b) #打印a,b两个字典
运行结果:
字典的删除:
1、删(pop):
写法:
a = dict(gaoxidong=[23, '运维', 6000],
zhangsan=[26, '运维', 8000],
)
print(a.pop('gaoxidong')) #删除key值,并返回删除key值的value值
print(a) #删除后打印字典a
a.pop('zhangsan01') #如果key值不存在 会报错
运行结果:
2、删除(del全局都可以用)
写法:
a = dict(gaoxidong=[23, '运维', 6000],
zhangsan=[26, '运维', 8000],
)
del a['gaoxidong'] #这种删除并不会返回被删除的key值 #在pycharm中这里地方是无法加print的 ##错误写法 print(del a['gaoxidong'])
print(a)
运行结果:
3、删除(poitem ):
注意事项:
#以LIFO的方式删除一对值
##LIFO的方式表示,从最后一个key值删除 ,在py3.7之前是随机删除(因是3.7版本之前字典排序是无序的)
#注意poitem()#小括号内无法填写值,不能删除固定的key值
写法:
a = dict(gaoxidong=[23, '运维', 6000],
zhangsan=[26, '运维', 8000],
)
print(a.popitem()) #打印删除的值 #括号内无法填写值
print(a) #打印删除后的结果
运行结果:
删掉了最后一个行字典
4、清空(clear)
注意事项:
如果你用clear清空的方式,会将你所有的对应 的 字典 全部清空
b = {
'zhangsan': [30, '开发', 12000],
'lisi': [26, '运维', 8000]
}
print(b.clear()) #这里注意如果你打印的话,返回的是None的值 也就是空,但是效果还是会执行的
print(b) #打印执行结果
运行结果:
字典的改:
1、普通修改
写法:
a = dict(gaoxidong=[23, '运维', 6000],
zhangsan=[26, '运维', 8000],
)
a["gaoxidong"][1] = "开发" #将字典“gaoxidong”对应的value值修改(修改列表)
a["gaoxidong"][2] = "10000"
print(a)
运行结果:
2、合并修改
注意事项:
#将b字典更新到a字典,如果a字典中有b字典的重复key值,那么b字典的value值会覆盖a字典的value值
#定义列表a
a = dict(gaoxidong=[23, '运维', 6000],
zhangsan=[26, '运维', 8000],
)
#定义列表b
b = {
'zhangsan': [30, '开发', 12000],
'lisi': [26, '运维', 8000]
}
#将b字典更新到a字典,如果a字典中有b字典的重复key值,那么b字典的value值会覆盖a字典的value值
a.update(b) #将b字典更新到a字典当中
print(a)
运行结果:
字典查询:
1、查(get):
注意事项:
get查询方法,如果查询的key值不存在,不会报错,只会显示None空
a = dict(gaoxidong=[23, '运维', 6000],
zhangsan=[26, '运维', 8000],
)
print(a.get('gaoxidong')) #如果key值存在 则返回value值
print(a.get('gaoxidong01')) #如果key值不存在,不会报错,但是会返回None(为空)
#如果在python中直接写a.get('gaoxidong01')则不会报错 不加print也看不到返回的'None'
运行结果:
2、普普通通查询法(与get不同)
注意事项:
这个与get的方法不同,这个方法查询,没有会报错,注意两者之间的区别
b = {
'zhangsan': [30, '开发', 12000],
'lisi': [26, '运维', 8000]
}
print(b['zhangsan']) #存在则返回一个key值的value值
print(b['zhangsan01'])#不存在的key值则会直接报错
###运行结果
[30, '开发', 12000]
KeyError: 'zhangsan01' #报错信息
运行结果:
字典推导式
a = "候鸡狗猪鼠牛虎兔龙蛇马羊"
b = {i:"test" for i in a} #字典推导式与列表推导式是非常相似的,不过字典推导式key值不能重复
print(b)
运行结果:
关于字典的长度写法:
注意事项:
#key与value是一个 所以长度也就是按key值来返回结果的 几个key 长度就是几个
写法:
a = dict(gaoxidong=[23, '运维', 6000],
zhangsan=[26, '运维', 8000],
)
print(len(a)) #len()方法同时用于字符串与列表 字典也是可以的
#key与value是一个 所以长度也就是按key值来返回结果的 几个key 长度就是几个
运行结果:
判断字典中是否有key值
方法: in
写法:
b = {
'zhangsan': [30, '开发', 12000],
'lisi': [26, '运维', 8000]
}
print('zhangsan' in b) #如果key值zhangsan在字典内则返回 True
print('zhangsan01' in b)#如果不在则返回 False
运行结果:
关于字典的循环写法
注意事项:
当你想把对应value值内包含的列表中单个的显示出来,不可写成 b.values()[1],只能用于循环来取单个值
这样查询出来的值为元组形式
写法:
#定义列表
b = {
'zhangsan': [30, '开发', 12000],
'lisi': [26, '运维', 8000]
}
###显示全部key值
print(b.keys())
#循环写法
#for i in b.keys(): #values同理
# print(i)
###显示全部value值
print(b.values()) #这里注意没办法当成列表使用 ##错误示范 b.values()[0] #这样写是错误的
###只能用于循环来单个取值!!!
运行结果:
以上的写法效率不高,我们可以将其转换为元组的形式:
以下很明显看到 在转换为元组以后,能更方便我们提取里面的 key值与value值
b = {
'zhangsan': [30, '开发', 12000],
'lisi': [26, '运维', 8000]
}
print(b.items()) #将字典转换为元组
for k,v in b.items(): #将key值vlaue值分别赋值给k,v
print(k)
print(v)
运行结果:
关于字典的特殊用法:
批量生成字典方法:
批量生成字典方法:
写法:
#批量生成字典formkeys(生成多个key与value值) a = ['gaoxidong', 'zhangsan', 'wangwu'] # 首先定义一个列表 b = dict.fromkeys(a) # 注意不给默认值的话 字典结果为None(空) print(b) c = dict.fromkeys(a, 'test') # 加一个默认值,但是注意后面加的默认值是固定的 print(c)
运行结果:
copy复制 同列表一样是浅copy
注意事项:
浅copy 就跟藕断丝连差不多下面有代码跟解释可以自行尝试
写法:
b = {
'zhangsan': [30, '开发', 12000],
'lisi': [26, '运维', 8000]
}
c = b.copy()
print(b)
c['zhangsan'][2] = 14000 #如果c的value值修改了,那么b的也会跟着一块变 #这就是浅copy
print(c,b)
运行结果:
小练习(将多个列表合为一个字典)
要求:生成一个百人的字典,并且每个value值不能一样
写法:
import random,faker #没有faker 请用 pip install faker下载,#faker是人名库
#random 随机取值模块
a = []
name = faker.Faker(locale="zh_CN") #设置中文
for i in range(1, 101): #我们批量创建100个字典
# suiji = random.randint(1, 30)
a.append(f"{name.name()}") #先将内容加入到列表中
print(a)
###列表推导式方法 a = [f"{name.name()}"for i in range(1,101)]
b = [] #定义空列表
for s in range(1, len(a) + 1): #我们根据a例表的长度 +1,因为从1开始的 但不包括1 所以+1
age = random.randint(18, 35)
RMB = random.randint(3000, 10000)
b.append([f"员工号:{s}", f"年龄:{age}", RMB]) #将内容加入到列表b中
c = dict(zip(a,b)) #将a列表与b列表结合,并且a列表的值当key值,b列表当value值
print(c)
运行结果:



