dictionary,字典,是一种可变容器模式。在某些语言中称为map。
字典也称为关联数组或哈希表。
字典使用键-值(key-value)存储,具有极快的查找速度。字典和列表不同,字典里的对象是无序的,是通过一对对的键和值来反映一种映射关系。
在每个键值对中,键和值用冒号分隔,键值对之间用逗号分隔,整个字典包括在大括号中。
键必须是唯一的,不允许同一键出现两次;(在创建时如果同一个键被创建两次,则后一个会覆盖前一个)。值可以不唯一。
创建字典以及访问字典里的值
假设要根据同学的名字查找对应的成绩,如果用list 实现,需要两个list :names =[' 小明', ' 小华', ' 小强']scores =[95, 75, 85] 给定一个名字,要查找对应的成绩,就先要在names 中找到对应的位置,再从scores 取出对应的成绩,list 越长,耗时越长。 如果用dict 实现,只需要一个“名字”- “成绩”的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。 【例】#由空字典填充新的键和值
d={}
d['name']='Runoob'
d['url']='www.runoob.com'
print(d)
【例】直接创建字典
w={'name':'Runoob','url':'www.runoob.com'}#创建字典
print(f'{w["name"]}: {w["url"]}')#访问指定键,输出对应的值
【例】由列表生成字典,用dict()函数和zip()函数
#由列表生成字典
key_list=['小明','小华','小强']
value_list=[95,75,85]
dic=dict(zip(key_list,value_list))#映射函数方式来构造字典
print(dic)
【例】字典的值可以是任何Python对象,例如字符串、数字、元组等
dic={'小明':95,'小华':75,'小强':85,"小张":{100,99},"小王":[97,98]}#值可以是元组、列表等
print(f"小张的成绩是:{dic['小张']}")
print(f"小王的成绩是:{dic['小王']}")
【例】但是,字典的键必须是不可变对象,即可以用数字、字符串或元组充当,但是不可以用列表、集合。
dic={('小明'):95,'小华':75,'小强':85}#键可以是元组,因为元组是不可变类型
print(dic['小明'])
运行结果:
95
dic={('小明','小周'):95,'小华':75,'小强': 85}#键可以是元组,因为元组是不可变类型
print(dic['小明','小周'])#此行这样写也对:print(dic[('小明','小周')])
运行结果:
95
以下是错误的:
dic={['小明']:95,'小华':75,'小强':85}#错。键不可以是列表
获取指定键值
【例】get()方法获取指定键对应的值
dic={'Name':'Runoob','Age':27}
print("Age 值为 : %s"% dic.get('Age'))#此处也可以用dic['Age']
print("Sex 值为 : %s"% dic.get('Sex',"不存在"))#如果不存在该键,则返回"不存在"
以下程序运行结果同上:
dic={'Name':'Runoob','Age':27}
print("Age 值为 : %s"% dic.get('Age'))#此处也可以用dic['Age']
if dic.get('Sex')==None: #get()方法获取不到键则返回None
print("%s 值为 :不存在"%'Sex')
【例】
dic={'小明':95,'小华':75,'小强': 85}#创建字典,'小明''小华''小强'是键key,95、75、85是对应的值value
name=input("请输入你要查询的姓名:")
print(f"{name}的成绩是:{dic[name]}")#根据键访问对应的值,键用方括号括起来
print(f"{name}的成绩是:{dic.get(name)}")#利用get()方法根据键访问对应的值
print("%s的成绩是:%d"%(name,dic[name]))#另一种格式化输出
print("%s的成绩是:%d"%(name,dic.get(name)))#另一种格式化输出
【例】
dic={'小明':95,'小华':75,'小强':85}#创建字典,'小明''小华''小强'是键key,95、75、85是对应的值value
name=input("请输入你要查询的姓名:")
if dic.get(name)!=None:#get()方法获取不到键则返回None
print(f"{name}的成绩是:{dic[name]}")#根据键访问对应的值,键用方括号括起来
else:
print("你输入的姓名不存在")
修改字典
【例】d[键]=值
dic={'Name':'王海','Age':17,'Class':'计算机一班'}
dic['Age']=18#更新'Age'对应的值
dic['School']='实验初中'#增加新的键/值对
dic['School']='泗阳中专'#更新值
print("dic['Age']:",dic['Age'])
print("dic['School']:",dic['School'])
【例】
dic={'Name':'王海','Age':17,'Class':'计算机一班'}
dic['团员']=True #赋值时,不存在的会自动添加
print(dic)
【例】
dic={'Name':'王海','Age':17,'Class':'计算机一班'}
print(dic.setdefault('Age'))#setdefault()方法得到指定键对应的值
print(dic.setdefault('department',"综合部"))#setdefault()方法,如果不存在则创建之,返回添加的值
print(dic.setdefault('团员',True))
print(dic)
注:低版本的Python打印出的字典顺序和创建时的顺序可能不相同,3.6以后新版本的相同
获取字典里的所有键/值对、键、值
【例】keys()方法获得键
#遍历键
dic={'Name':'王海','Age':17,'Class':'计算机一班'}
for key in dic.keys():
print(key)
【例】values()方法获得值
#遍历值
dic={'Name':'王海','Age':17,'Class':'计算机一班'}
for value in dic.values():
print(value)
【例】items()方法获得字典元素(键/值对)
#遍历字典中的元素(键值对)
#每对键值组成一个元组
dic={'Name':'王海','Age':17,'Class':'计算机一班'}
for item in dic.items():
print(item)
【例】items()方法获得键/值对
#遍历字典中的元素(键值对)
#以key=……,value=……的格式输出
dic={'Name':'王海','Age':17,'Class':'计算机一班'}
for key,value in dic.items():
print(f"key={key},value={value}")
【例】items()方法获得键/值对,keys()方法获得键,values()方法获得值
dic={'Name':'王海','Age':17,'Class':'计算机一班'}
print(dic)#输出原字典
for key,value in dic.items():#输出键/值对
print(key,value)
print('\n')
print(dic.items())#用items()方法把每对键值组成一个元组放在列表中返回
list1=[k+'='+str(v) for k,vin dic.items()]#由字典的键/值对生成一个列表
print(list1)#输出生成的列表
print(dic.keys())#以列表形式返回所有键
list2=[k for k in dic.keys()]#由字典的键生成一个列表
print(list2)
print(dic.values())#以列表形式返回所有值
list3=[v for v in dic.values()]#由字典的值生成一个列表
print(list3)
删除字典中的元素
方法一,用pop()方法
【例】用pop(key)方法删除指定key对应的键/值对,该方法返回被删除的值value
dic={'Name':'王海','Age':17,'Class':'计算机一班','weight':68}
print(dic)#输出原字典
del_key=input('请输入你要删除的键:')
print(f"你删除的键是:{del_key},对应删除的值是:{dic.pop(del_key)}")#用pop()方法删除键值对并返回被删除的值
print("删除后:\n",dic)
方法二,用del语句
【例】
dic={'Name':'王海','Age':17,'Class':'计算机一班','weight':68}
print(dic)#输出原字典
del dic['weight']#删除一个键/值对
for key,value in dic.items():#
print(key,value)
print(dic.items())#用items()方法输出所有键/值对
del dic#删除整个字典
del dic#删除字典,字典就不存在了
另有:dic.clear()#清空字典(删除字典内所有元素),得到空字典。
判断某键是否在字典里
使用in运算。对于Value不适用。
【例】
dic={'Name':'王海','Age':17,'Class':'计算机一班'}
print('Age' in dic)
运行结果:
True
注:Python3中取消了判断是否有某键的has_key()方法print(dic.has_key('Age'))
直接赋值和copy的区别
【例】使用=拷贝和使用copy()拷贝不一样。
dic1={'Name':'王海','Age':17,'Class':'计算机一班','score':[190,120,40]}
dic2=dic1#浅拷贝:引用对象,同步变化
dic3=dic1.copy()#深拷贝父对象,浅拷贝子对象(二级目录)
dic1['Name']='刘德华'#修改
dic1['score'].remove(40)#删除内嵌列表中的40
print(dic1)
print(dic2)#dic2是浅拷贝,所以跟随原dic1同步变化
print(dic3)#dic3由copy()拷贝而来,父对象深拷贝,不和原字典同步;子对象浅拷贝,跟随原dic1同步变化
一些相关函数
用len()函数统计字典元素的个数,即键的个数
dic={'Name':'王海','Age':17,'Class':'计算机一班'}
print(len(dic))#字典名字放在len的括号中
运行结果:
3