本文章记录观看B站python教程学习笔记和实践感悟,视频链接:【花了2万多买的Python教程全套,现在分享给大家,入门到精通(Python全栈开发教程)】 https://www.bilibili.com/video/BV1wD4y1o7AS/?p=6&share_source=copy_web&vd_source=404581381724503685cb98601d6706fb
上节课学习了元组的创建与删除,元组的访问及遍历,元组生成式,本节课记录的知识点有字典的创建与删除,字典元素的访问及遍历,字典操作的相关方法,字典生成式。
1.字典的创建与删除
字典,跟我们生活中认识的字典类似,根据页码,也就是“键”去找相应的元素。
特别注意的是,上节课学了元组是不可变数据类型,而字典跟列表一样也是可变数据类型,也就是说它也能增删改查,但是与列表不同的字典中的元素是无序的,因为字典的底层使用了hash。
所谓无序就是。第一个存进字典中的元素未必是内存中的第一个。
键值是一一对应的,不可有重复,但是值可以重复;字典的键要求是不可变序列,那么可以作为字典的键的数据类型有字符串、整型、浮点型、元组,只有列表不行(因为列表是可变数据类型)。
下面是创建字典的语法结构:
一、创建字典
下面我们分别用这两种方式来创建字典:
#(1)创建字典
d={10:'cat',20:'dog',30:'pet',20:'zoo'}
print(d) #注意看上面那一行的20:'zoo',前面虽然已经有20的键值对了,但是key相同的时候,后面的value值会覆盖前面的
#(2)zip函数创建字典
lst1=[10,20,30,40]
lst2=['cat','dog','pet','zoo']
zipobj=zip(lst1,lst2) #利用zip()对键和值进行配对
print(zipobj) #<zip object at 0x00000158D1FA9500>,也就是说映射的结果是一个zip对象
#与元组的生成器对象相似,为了可以看到这个zip对象里的内容,要将映射对象转成其他类型后再print
#方法一:转为列表再查看
print(list(zipobj)) #[(10, 'cat'), (20, 'dog'), (30, 'pet'), (40, 'zoo')],可以发现每一组键值对都是一个小元组
结果:
下面考虑第二种转化对象的方法,就是转成字典。
#(1)创建字典
d={10:'cat',20:'dog',30:'pet',20:'zoo'}
print(d) #注意看上面那一行的20:'zoo',前面虽然已经有20的键值对了,但是key相同的时候,后面的value值会覆盖前面的
#(2)zip函数创建字典
lst1=[10,20,30,40]
lst2=['cat','dog','pet','zoo']
zipobj=zip(lst1,lst2) #利用zip()对键和值进行配对
print(zipobj) #<zip object at 0x00000158D1FA9500>,也就是说映射的结果是一个zip对象
#与元组的生成器对象相似,为了可以看到这个zip对象里的内容,要将映射对象转成其他类型后再print
'''
方便起见先把第一种方法注释掉,否则就会因为zipobj已经被转成列表类型,使得方法二报错
#方法一:转为列表再查看
print(list(zipobj)) #[(10, 'cat'), (20, 'dog'), (30, 'pet'), (40, 'zoo')],可以发现每一组键值对都是一个小元组
'''
#方法二:转为字典类型
d=dict(zipobj)
print(d) #{10: 'cat', 20: 'dog', 30: 'pet', 40: 'zoo'},此时输出的才是真的字典类型
结果:
二、验证元组可以做键,而列表不行
实验代码如下:
t=(10,20,30)
print({t:10}) #t是key,10是t这个键对应的value,运行成功,元组可以作为字典中的key
#下面测试列表是否可以做key
lst=[10,20,30]
print({lst:10}) #报错TypeError: unhashable type: 'list',因此列表不可以作为key
结果:
三、使用参数创建字典,作为序列的基础操作
也可以使用参数创建。字典也是序列的一种,这就表明序列的操作同样适用于字典。
#(3)使用参数创建字典
d=dict(cat=10,dog=20)
print(d) #{'cat': 10, 'dog': 20},可以发现cat和dog成了key,
print('max:',max(d)) #序列的求最大值,也适用于字典,不过这比较的是值,输出的结果是键
print('min:',min(d)) #序列的求最小值,也适用于字典,比较和输出同上
print('len:',len(d)) #序列的求元素个数,也适用于字典,一个键值对是一个元素
结果:
删除操作跟序列也相同;
#字典的删除
del d #要保证d这个字典是非空的
print(d) #此时就会报错没有d,因为已经把它删了
特别注意:
2.字典元素的访问及遍历
接着看上面这个图(下面是粘贴过来的)
下面是字典元素的访问
#字典的访问和遍历
d={'hello':10,'world':20,'python':30}
#访问字典中的元素
#(1)使用d[key]
print(d['hello'])
#(1)使用d.get(key)
print(d.get('hello'))
#两者之间是有区别,如果key不存在,d[key]报错get(key)可以指定默认值
#print(d['java']) #KeyError: 'java'
print(d.get('java')) #none
print(d.get('java','不存在')) #用d.get()指定默认值
#字典的遍历
for item in d.items():
print(item) #是key=value组成的一个元组
#在使用for循环遍历时,分别获取key,value
for key,value in d.items():
print(key,'--->',value)
结果:
3.字典操作的相关方法
下图为字典的相关操作方法:
代码如下:
#字典的相关操作方法
#第一步:创建一个字典
d={1001:'李梅',1002:'王华',1001:'张峰'}
print(d)
#第二步:添加元素
print('------添加元素------')
d[1004]='张丽丽' #直接使用赋值运算符d[]向字典添加元素
print(d)
#第三步:获取字典中所有的key
print('------获取字典中所有的key------')
keys=d.keys()
print(keys) #dict_keys([1001, 1002, 1004])
print(list(keys)) #转成列表类型去查看元素
print(tuple(keys)) #转成元组类型去查看元素
#第四步:获取字典中所有的value
print('------获取字典中所有的value------')
values=d.values()
print(values) #得到的是一个对象dict_values(['张峰', '王华', '张丽丽'])
print(list(values)) #通过转成列表来查看只有value部分
print(tuple(values)) #通过转成元组来查看只有value部分
#如果将字典中的数据转成key-value的形式,以元组的方式进行展现
print('------数据转成key-value的形式------')
lst=list(d.items())
print(lst) #转成了了列表,但是列表中每一个键值对都是一个元组
#下面是再转回字典
d=dict(lst)
print(d)
#第五步:删除操作
print('------用pop函数删除元素------')
print(d.pop(1001))
print(d)
print('------用pop函数删除一个不存在的元素,并指定默认值------')
print(d.pop(1008,'不存在'))
print('------用pop函数随机删除元素------')
print(d.popitem())
print(d)
print('------清空字典中所有的元素------')
d.clear()
print(d)
#python中一切皆对象,每个对象都有一个布尔值
print(bool(d)) #空字典的布尔值为false
结果如下:
4.字典生成式
代码如下:
import random
d={item:random.randint(1,100) for item in range(4)}
print(d)
#创建两个列表
lst=[1001,1002,1003]
lst2=['陈梅梅','王一一','李华']
d={key:value for key,value in zip(lst,lst2)} #第一个列表元素做键,第二个列表元素做值
print(d)
结果如下:
本节完。