创建字典
什么是字典
- 字典就是用于保存具有映射关系的数据,字典相当于保存两组数据,其中一组是关键数据,成为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访问value
dictb = 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['大学'] = None
print(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,第二个是value
scores_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为None
scores = {'语文':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默认值) = newscores
print(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