创建字典
什么是字典
- 字典就是用于保存具有映射关系的数据,字典相当于保存两组数据,其中一组是关键数据,成为key;另一组数据可以通过key来访问,被称为value
特性: 字典中每一个key对应一个value,每一个key都不能相同,但是value可以多个相等
创建字典
- 花括号法:花括号应包含多组key-value对,key-value之间用英文的冒号隔开;多组key-value对之间使用英文逗号隔开
#字典中key和value一一对应,key都是独一无二的不可以相同,value可以多个相同scores = {'语文':89,'数学':78,'英语':95,'地理':78}print(scores)
- dict构造器:可以传入多个列表或元组参数作为key-value对;也可以为dict指定关键字参数创建字典,此时字典的key不允许使用表达式
#使用dict创建字典时,列表/序列中的每个元素必须包含两个子元素如下,如若子元素个数不为2,则字典创建失败,返回'ValueError: dictionary update sequence element #3 has length 3; 2 is required'dicta = dict([('小学',7),('初中',13),('高中',16),('大学',19)])print(dicta)
#使用关键字参数创建字典(dict)时,不能使用表达式dictb = dict(小学=7,初中=13,高中=16,大学=19)print(dictb)
- 字典的key是不可变的,因此列表不能作为dict的key
操作字典key-value对
- 使用方括号和key来访问key对应的value值
#字典中通过key访问valuedictb = dict(小学=7,初中=13,高中=16,大学=19)print(dictb['高中'])
- 当对不存在的key赋value值时,相当于给字典添加字典元素
#字典元素的添加dictb = dict(小学=7,初中=13,高中=16,大学=19)dictb['社会实践'] = 'forever'print(dictb)
- 当对已存在的key赋value值时,相当于替换字典中对应key的value值
#字典元素替换dictb = dict(小学=7,初中=13,高中=16,大学=19)dictb['高中'] = 'forever'print(dictb)
- 删除key-value对
#字典元素的删除dictb = dict(小学=7,初中=13,高中=16,大学=19)del dictb['高中']print(dictb)
将指定的key赋值为None时不能删除key-value对
#字典元素的删除dictb = dict(小学=7,初中=13,高中=16,大学=19)del dictb['高中']dictb['大学'] = Noneprint(dictb)del dictb['大学']print(dictb)#我这里赋值为None后依然可以被删除,有点疑惑这是为什么,大佬可以评论告诉我,谢谢!
- 使用in、not in判断dict是否包含指定的key
#使用in 、not in判断元素是否再字典内dictb = dict(小学=7,初中=13,高中=16,大学=19)print('小学' in dictb) #返回True 说明'小学'在dictb中print('初中' not in dictb) ##返回False 说明'小学'在dictb中
理解dict和list的关系
- 字典相当于索引,是任意不可变类型的列表,而列表相当于key只能是整数的字典;如果程序中要使用字典的key都是整数类型,则可以考虑是不是要换成列表
- 列表的索引总是从0开始,也不需要连续。因此列表不允许对不存在的索引赋值;但字典则允许直接对不存在的key赋值,这样就会直接给字典新增了一对key-value值
# 总结: 字典(dict)和列表(list)都是可变的,都可以对内部元素进行增加、删除、修改的操作 但是因为字典的key是不可变的,所以列表(list)不能直接赋值于key
字典用法的进阶
字典的常用方法
- dir(dict) 查看字典所支持的方法
- clear() 用于清空字典的所有key-value对
#clear()清空字典内所有key-value,被清空的字典就是一个空字典返回'{}'scores = {'语文':89,'数学':78,'英语':95,'地理':78}scores.clear()print(scores)
- get() 方法其实就是根据key来获取value
#get()根据key来获取value值scores = {'语文':89,'数学':78,'英语':95,'地理':78}print(scores.get('数学'))
- update()方法可使一个字典所包含的key-value对来更新另一个已有的字典.
#使用update()方法,用一个新的字典去更新另一个已有的字典scores = {'语文':89,'数学':78,'英语':95,'地理':78}scores_a = {'语文':90,'数学':98,'生物':76}scores_b = [('历史',98),('自然',75),('Python',100)]scores_c = dict(彭同学=88,雷同学=79,李同学=90) #注意使用关键字定义字典时,括号内不允许有表达式(key不需要引号)scores.update(scores_a)print(scores)#更新目标.update(使用对象)scores_a.update(scores_b)print(scores_a)#若字典使用序列作为参数,此时序列的每个元素必须包含两个子元素,第一个是key,第二个是valuescores_temp = dict(scores_b) #先将列表转为字典scores_temp.update(scores_c) #再使用scores_c,来更新这个转化好的字典print(scores_temp)#注意使用关键字定义字典时,括号内不允许有表达式(key不需要引号)
- iteme()、keys()、value()分别用于获取字典中所有的key-value、所有的key、所有的value
#使用items()、keys()、values()分别遍历字典中的所有元素(每个元素包含一个key,一个value)、遍历字典中的所有key(只遍历key)、遍历所有value(只遍历value)scores = {'语文':89,'数学':78,'英语':95,'地理':78}for key in scores.keys(): print(key) for value in scores.values(): print(value) for item in scores.items(): #liems这里面使用到了序列的解包 print(item)
- pop() 方法用于获取、并删除指定key对应的value
#使用pop()方法获取并删除key对应的value(删除并返回key对应的value值)scores = {'语文':89,'数学':78,'英语':95,'地理':78}return1 = scores.pop('地理')print(scores)print(return1)
- popitem()方法用于随机地弹出字典中一个key-value对
- setdefault()方法也用与根据key来获取对应value的值,并为不存在的key设置默认值(创建字典的地三种方法)
#使用setdefault()方法获取对应key的value值,如果key不存在,则添加一个key到字典中并设置value为Nonescores = {'语文':89,'数学':78,'英语':95,'地理':78}a = scores.setdefault('数学')print(a)scores.setdefault('生物')print(scores)
- fromkeys() 方法可将序列转化为字典,可以给转化的字典设置一个固定的value值
#使用formkeys()转化序列为字典d = dict.fromkeys(['RNG','IG','BLG','LNG'],35) #dict.fromkeys(序列,value默认值) = newscoresprint(d)
使用字典对字符串格式化
- 在字符串模板中按key指定变量,然后通过字典为字符串模板中的key设置值
#使用字典格式化字符串str1 ="今年是%4.0f年""我在学习%s"print(str1%(2019,'Python')) #普通的格式化字符串str2 = "今年是%(nian)4.0f年""我在学习%(name)s" #字典格式化字符串print(str2 % {'nian':2019,'name':'Python'})
总结: 两种字符格式化原理其时是一样的,不同的时第一种是根据字符的先后位置来填充字符串;而字典格式化字符串则是根据设置好的key来指定对应的value