字典的使用

创建字典的方式
  1. 使用{}创建字典
  1. 语法:{k1:v1,k2:v2,k3:v3,k4:v4,k5:v5}
# 创建字典
 dic = {'name':'贾宏声',age:28,'gender':'男'}
 print(dic,type(dic))
 # 输出结果
 # {'name': '贾宏声', 'age': 28, 'gender': '男'} <class 'dict'>
  1. 使用dict()函数来创建字典
  1. 每一个参数都是一个键值对,参数名就是键,参数名就是值(这种方式创建的字典,key都是字符串)
dic = dict(name='贾宏声',age=28,gender='男')
 print(dic,type(dic))
 # 输出结果
 # {'name': '贾宏声', 'age': 28, 'gender': '男'} <class 'dict'>
  1. 也可以将一个包含有双值子序列的序列转换为字典
  1. 双值是指,序列中的元素只有两个值,[1,2] (1,2) 'ab'
  2. 子序列是指,如果序列中的元素也是序列,那么就称这个元素为子序列,如:[(1,2),(3,5)]就是双值的子序列
dic = dict(name='贾宏声',age=28,gender='男')
  dic = dict([('name','JiaHongSheng'),('age',18)])
  print(dic,type(dic))
  # 输出结果
  # {'name': 'JiaHongSheng', 'age': 18} <class 'dict'>
字典的相关函数
  1. len() 获取字典中键值对的个数
dic = dict(name='贾宏声',age=28,gender='男')
 print(len(dic))
 # 输出结果
 # 3
  1. in 、ont in
  1. in 检查字典中是否包含指定的键
  2. not in 检查字典中是否不包含指定的键
dic = dict(name='贾宏声',age=28,gender='男')
print('hello' in dic)
print('hello' not in dic)
print('name' in dic)
print('age' not in dic)
# 输出结果
# False
# True
# True
# False
  1. 获取字典中的值,根据键来获取值.通过[]来获取值时,如果键不存在,会抛出异常keyError
  1. 语法:d[key]
dic = dict(name='贾宏声',age=28,gender='男')
 print(dic['name'])
 print(dic['age'])
 print(dic['gender'])
 # 另一种形式
 n = 'name'
 print(dic[n])
 # 输出结果
 # 贾宏声
 # 28
 # 男
 # 贾宏声
  1. 获取字典中的值的另一种方法:get(key[,default]),该方法会根据键来获取字典中的值.如果获取的键在字典中不存在,会返回None。也可以指定一个默认值,来作为第二个参数,这样在获取不到值的时候,将会返回默认值。
dic = dict(name='贾宏声',age=28,gender='男')
print(dic.get('name'))
# 输出结果:贾宏声
print(dic.get('hello')) # 一个字典中没有的元素
# 输出结果:None
print(dic.get('hello','默认值')) # 可自定义在要查询元素没有的时候返回默认值
# 输出结果:默认值
print(dic.get('age','默认值')) # 可自定义在要查询元素没有的时候返回默认值,如果有则返回查询key的值
# 输出结果:28
  1. 修改字典
  1. 语法:dic[key] = value 如果key存在则覆盖,不存在则添加
dic = dict(name='贾宏声',age=28,gender='男')
dic['name'] = 'JiaHongSheng' # 修改字典中的key-value
print(dic)
# 输出结果,此时的name的value已经被修改为‘JiaHongSheng’
# {'name': 'JiaHongSheng', 'age': 28, 'gender': '男'}

dic['address'] = '中央戏剧学院' # 向字典中添加key-value
print(dic)
# 输出结果
# {'name': 'JiaHongSheng', 'age': 28, 'gender': '男', 'address': '中央戏剧学院'}
  1. setdefault(key[,default])可以用来向字典中添加key-value
  1. 如果key已经存在于字典中,则返回key的值,不会对字典做任何操作
  2. 如果key不存在,则向字典中添加这个key,并设置value
dic = dict(name='贾宏声',age=28,gender='男')
  dic.setdefault('name','JiaHongSheng') # 该key已经存在于字典中,字典不会有变化
  dic.setdefault('school','中央戏剧学院') # 该key在字典中不存在,会向字典中添加这个key-value
  # 返回对应key的值
  print('result1 = ',result1) 
  print('result2 = ',result2)
  # 输出结果
  # result1 =  贾宏声
  # result2 =  中央戏剧学院        
  print(dic)
  # 输出结果
  # {'name': '贾宏声', 'age': 28, 'gender': '男', 'school': '中央戏剧学院'}
  1. update([other])
  1. 将其他的字典中的key-value添加到当前字典中
  2. 如果有重复的key,则后边的会替换当前的
# update([other])
 dic1 = {'a':1,'b':2,'c':3,'d':4}
 dic2 = {'e':5,'f':6,'g':7,'h':8}
 dic1.update(dic2)
 print(dic1)
 # 输出结果
 # {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8}
 
 # 此时的两个字典中有两key名为a,则key-->a 的value会由原先的1,变成后来的8
 dic1 = {'a':1,'b':2,'c':3,'d':4}
 dic2 = {'e':5,'f':6,'g':7,'a':8}
 dic1.update(dic2)
 print(dic1)
 # 输出结果
 # {'a': 8, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7}
  1. 字典的删除操作
  1. 使用del来删除字典中的key-value。
  1. 该种方式在删除不存在的key-value时会报错
dic  = {'name':'贾宏声','age':27,'gender':'男'}
 # 使用 del 删除age
 del dic['age'] 
 print(dic)
 # 输出结果:此时dic中的age元素就被删除了
 # {'name': '贾宏声', 'gender': '男'}
  1. 使用popitem()方法
  1. 该方法会随即删除字典中的一个键值对,一般都会删除最后一个键值对
  2. 删除之后,它会将删除的key-value作为返回值返回,返回的是一个元组,元组中有两个元素,第一个元素是删除的key,第二个元素是删除的value
  3. 当使用popitem()删除一个空字典时,会抛出异常keyError:'popitem():dictionary is empty'
dic = dict(name='贾宏声',age='18',gender='男',address='中央戏剧学院')
# 对dic使用popitem()方法
dic.popitem()
print(dic)
# 输出结果:此时对比原字典可知字典中的最后一个address元素被删除
# {'name': '贾宏声', 'age': '18', 'gender': '男'}
  1. 返回值验证
dic = dict(name='贾宏声',age='18',gender='男',address='中央戏剧学院')
# 定义变量接收popitem()方法的返回值
result = dic.popitem()
print('popitem()删除的元素是:',result)
# 输出结果:返回一个元组
# popitem()删除的元素是: ('address', '中央戏剧学院')
  1. 删除空字典结果验证
# 使用popitem()删除一个空字典
dic = dict(name='贾宏声')
dic.popitem() # 第一次删除
print('第一次删除后:',dic)
dict.popitem() # 第二次删除,此时已为空字典,会有异常抛出
# 输出结果:
# TypeError: descriptor 'popitem' of 'dict' object needs an argument
  1. pop(key[,default])
  1. 根据key删除字典的key-value,会将被删除的value返回
  2. 如果删除不存在的key,会抛出异常。如果制定了默认值,在删除不存在的key时,不会报错,而是直接返回默认值
dic = dict(name='贾宏声',age=27,gender='男',address='中央戏剧学院')
  # 删除字典中的name元素,并用result变量接收其返回的值
  result = dic.pop('name')
  print('删除name后的字典:',dic)
  print('删除的元素的value是:',result)
  # 输出结果
  # 删除name后的字典: {'age': 27, 'gender': '男', 'address': '中央戏剧学院'}
  # 删除的元素的value是: 贾宏声
  1. 删除不存在的key
# pop()方法删除不存在的key
  dic = dict(name='贾宏声',age=27,gender='男',address='中央戏剧学院')
  dic.pop('hello')
  # 输出结果:保存回显keyError
  # KeyError: 'hello'
  
  # 新增第二个参数(默认值)
  dic = dict(name='贾宏声',age=27,gender='男',address='中央戏剧学院')
  # 给pop()方法传递第二个参数(默认值)
  result = dic.pop('hello','这是默认值,在删除的key不存的时候返回该默认值')
  print('返回信息:',result)
  # 输出结果
  # 返回信息: 这是默认值,在删除的key不存的时候返回该默认值
  1. clear()用来清空字典
dic = dict(name='贾宏声',age=27,gender='男',address='中央戏剧学院')
dic.clear()
print(dic)
# 输出结果
# {}
  1. 字典的复制
  1. copy()
  1. 该方法用于对字典的浅复制
  2. 复制以后的对象和原对象是相互独立的,修改其中任何一个对象都不会影响另一个对象
  3. 注意:浅复制会简单赋值对象内部的值,如果值也是一个可变对象,这个可变对象不会被复制
dic = {'name':'贾宏声','age':27,'address':'中央戏剧学院'}
  dic2 = dic.copy()
  print(dic,id(dic))
  print(dic2,id(dic2))
  # 输出结果:由其二者id不同可知他们是连个完全独立的对象
  # {'name': '贾宏声', 'age': 27, 'address': '中央戏剧学院'} 2774187005952
  # {'name': '贾宏声', 'age': 27, 'address': '中央戏剧学院'} 2774187006016
  dic2['age'] = 21
  print(dic,id(dic))
  print(dic2,id(dic2))
  # 输出结果:由此可见二者的修改不会相互影响,相互独立
  # {'name': '贾宏声', 'age': 27, 'address': '中央戏剧学院'} 1740147677184       
  # {'name': '贾宏声', 'age': 21, 'address': '中央戏剧学院'} 1740147677248
  1. 当遇到这种key的value也是一个字典(可变对象)的时候,copy()不会对可变对象进行复制
# 当遇到这种key的value也是一个字典(可变对象)的时候,copy()不会对可变对象进行复制
  dic = {'name':'贾宏声','other':{'occupation':'演员','gender':'男'},'age':27,'address':'中央戏剧学院'}
  dic2 = dic.copy()
  print(dic,id(dic))
  print(dic2,id(dic2))
  # 输出结果
  # {'name': '贾宏声', 'other': {'occupation': '演员', 'gender': '男'}, 'age': 27, 'address': '中央戏剧学院'} 2088578930752
  # {'name': '贾宏声', 'other': {'occupation': '演员', 'gender': '男'}, 'age': 27, 'address': '中央戏剧学院'} 2088578931072
  
  dic2['other']['occupation'] = '贝斯手'
  print(dic,id(dic))
  print(dic2,id(dic2))
  # 输出结果:此时的other的值是一个可变对象,在复制之后,对可变对象中的元素进行修改该后,二者同步发生变化,由此可见该可变对象并没有被复制,而是二者指向了同一个id的对象
  # {'name': '贾宏声', 'other': {'occupation': '贝斯手', 'gender': '男'}, 'age': 27, 'address': '中央戏剧学院'} 2770313762816
  # {'name': '贾宏声', 'other': {'occupation': '贝斯手', 'gender': '男'}, 'age': 27, 'address': '中央戏剧学院'} 2770313763136
  1. 字典的遍历
  1. keys()方法
  1. 该方法会返回字典中所有的key
  2. 该方法会返回一个序列,序列中保存有字典的所有的键
# 通过遍历keys()来获取所有的键
   dic = {'name':'贾宏声','other':{'occupation':'演员','gender':'男'},'age':27,'address':'中央戏剧学院'}
   for k in dic.keys() :
       print(k,dic[k]) # k 获取到字典中的key
   # 输出结果
   # name 贾宏声
   # other {'occupation': '演员', 'gender': '男'}
   # age 27
   # address 中央戏剧学院
  1. values()方法
  1. 该方法会返回一个序列,序列中保存有字典中的所有的值
dic = {'name':'贾宏声','other':{'occupation':'演员','gender':'男'},'age':27,'address':'中央戏剧学院'}
for v in dic.values() :
   print(v)
# 输出结果
# 贾宏声
# {'occupation': '演员', 'gender': '男'}
# 27
# 中央戏剧学院
  1. items()方法
  1. 该方法会返回字典中所有的项
  2. 它会返回一个序列,序列中包含有双值子序列
  3. 双值分别是,字典中的key和value
dic = {'name':'贾宏声','other':{'occupation':'演员','gender':'男'},'age':27,'address':'中央戏剧学院'}
print(dic.items())
# 输出结果
# dict_items([('name', '贾宏声'), ('other', {'occupation': '演员', 'gender': '男'}), ('age', 27), ('address', '中央戏剧学院')])

# 使用for循环遍历字典
dic = {'name':'贾宏声','other':{'occupation':'演员','gender':'男'},'age':27,'address':'中央戏剧学院'}
for k,v in dic.items() :
    print(k,'=',v)
# 输出结果
# name = 贾宏声
# other = {'occupation': '演员', 'gender': '男'}
# age = 27
# address = 中央戏剧学院