# 2020.09.30 字典
# 1.字典的定义与特性
# 2.字典的常用操作
# 3.字典的遍历
# -- 1 字典的定义
# 存储学生的信息时,涉及到学生的姓名.年龄.身高.体重,如果没有字典,只能写成如下形式
# [
# ('Mike',25,180,80)
# ('Jake',25,178,68)
# ]
# 但是这种写法有个问题,信息是用列表+元组组成的,元组中的元素是不可以更改的
# 就算是换成列表套列表,但是这样就信息不明确:
# namelist=[
# ['Mike',25,180,80]
# ['Jake',25,178,68]
# ]
# print(namelist[0][1]) 这个代码表述不明确,且一旦插入另一对象所有代码都得改
# 如果没有字典,传统方法有三大缺陷:
# -不清晰:
# age=students[0][1] #传统方式
# students['Mike']['age'] #字典的方式
# -查找麻烦:
# 需要遍历式的查找 #传统的方式
# 给出Key就可以得到students['Mike']['age'] #字典的方式
# 性能特别高 #字典的方式
# -扩展性差:
# 如果需要加一个字段,只能在后面加,不然老代码就会有问题 #传统的方式
# 随意添加字段.dictionary没有顺序 #字典的方式
# 所以引入字典的概念
# --内置类型:字典
# dict1={}
# dict2={'name':'Jack','age':30}
# key,value 的概念:
# key包含了dict2{'name'} dict2{'age'}
# 就像真正的字典前面的索引
# 访问不存在的key,会导致程序异常
# dict2.get('name',default=None)
# dict1={{}:12}
# # print(type(dict1)) #<class 'dict'>
# print(dict1)
# 字典的定义与特性:
# 1.键值成对出现的
# 2.键的类型可以是字符串,int,float,元组,布尔
# 不能是:列表 报错unhashable type: 'list'
# 字典 报错 unhashable type: 'dict'
# 值的类型是任意类型
# 3.字典可以改变值
# 4.字典是无序的,没有顺序就没有下标,不像列表
# 5.键永远是唯一的
# eg:怎么获取以下字典的值
# dict2={'name':'Jack','age':30}
# print(dict2)
# #字典是通过键来获取值的
# print(dict2['name']) #所以直接打印想要获取的值的键名就行了,键是字符串打印就需得是字符串
# --拓展,如果值是字典,怎么获取值的字典里面的键?如:
# dict2={'name':'Jack','age':{'info':23}}
# print(dict2['age']['info'])#得23;直接打印字典名[键名][嵌套字典的键名]
##嵌套的方法在接口自动化里面有很多,是常用操作
# -- 2 字典的特性
# 1.字典是mutable的
# 2.可以存储任意数量的元素
# 3.可以存储任何python数据类型
# value可以是任意类型
# key 可以是hash的类型,最常用也是最高效的是数字或者字符串
# 4.以key:value,即"键:值"对的形式存储数据,每个键是唯一的
# 5.根据键来找值效率非常高
# -- 2 字典的常用操作
# 1.查询操作
# 获取值--字典通过键去获取值
# dict={'奇数':1,'偶数':{'first':2,'second':6}}
# print(dict['偶数']['second']) #嵌套字典查询,接口自动化常用操作
# print(dict['自然数']) #如果字典获取的键不存在,会报错KeyError: '自然数'
# 2.修改操作:通过键去修改,前提是--键得存在!!!
# dict['要修改的键名']='修改之后的键值' eg:
# dict={'奇数':1,'偶数':{'first':2,'second':6}}
# print(dict) #得:{'奇数': 1, '偶数': {'first': 2, 'second': 6}}
# dict['偶数']='6'
# print(dict) #得:{'奇数': 1, '偶数': '6'}
# 3.增加 通过键去增加键值对,--键不存在!!! eg:
# dict={'奇数':1,'偶数':{'first':2,'second':6}}
# dict['自然数']='anything'
# print(dict) #得:{'奇数': 1, '偶数': {'first': 2, 'second': 6}, '自然数': 'anything'}
# 4.判断键存不存在,用in eg:
# dict={'奇数': 1, '偶数': {'first': 2, 'second': 6}}
# print('自然数' in dict) #打印返回的是布尔值False
# 5.删除 也是通过键来删除
# 没有remove方法,因为不通过值来删除 只有另外两种方法适用于字典的删除
# dict={'奇数': 1, '偶数': {'first': 2, 'second': 6}}
# # del dict['偶数']['second'] #或者写成dict.pop('键名'),但这样不能删除嵌套的字典
# print(dict) #得{'奇数': 1, '偶数': {'first': 2}},说明可以嵌套字典删除
# 6.查看字典有多少元素 元素的个数 len()函数
# dict={'奇数': 1, '偶数': {'first': 2, 'second': 6}}
# print(len(dict)) #得2,说明len()函数得到的就是键值对的个数
# 7.清空 dict.clear() 注意清空操作,字典地址没有变化,在原有地址清空内容 eg:
# dict={'奇数': 1, '偶数': {'first': 2, 'second': 6}}
# dict.clear()
# print(dict) #打印出来得: {} 字典dict已经被清空了
# 8.赋值 dict={} 注意赋值操作,字典的地址是变化了的,重新赋值新地址 eg:
# 9.获取所有的key dict.keys() 返回的是类列表 eg:
# dict={'奇数': 1, '偶数': {'first': 2, 'second': 6}}
# print(dict.keys()) #打印得:dict_keys(['奇数', '偶数'])
# 因为获取到的key数量不定,考虑到存储时应该存为什么类型,所以keys()获取到的
# dict_keys(['奇数', '偶数'])类型是 --类列表
# 类列表特点:1.不支持下标 2.支持遍历操作 演示:
# dict={'奇数': 1, '偶数': {'first': 2, 'second': 6}}
# print(dict.keys()[0]) #如果是列表,可以通过下标获取值,这里不支持下标
# 但是这里报错:'dict_keys' object does not support indexing 说明不是列表
###但是可以遍历,支持for循环操作
# dict={'奇数': 1, '偶数': {'first': 2, 'second': 6}}
# for one in dict.keys():
# print (one) #打印得键名,分行写的,说明可以支持for循环
# 如果真的想让keys()函数返回的是列表,可以使用下标,那就强制转化 演示:
# dict={'奇数': 1, '偶数': {'first': 2, 'second': 6}}
# print(list(dict.keys())) #返回的 ['奇数', '偶数']
# print(list(dict.keys())[0]) #返回的 奇数
# 10.获取所有的value: dict.values() 返回的也是类列表 eg:
# dict={'奇数': 1, '偶数': {'first': 2, 'second': 6}}
# print(dict.values()) #打印得:dict_values([1, {'first': 2, 'second': 6}])
# --获取到值之后就可以查询某个值是否在这个字典里面,用in 如:
# dict={'奇数': 1, '偶数': {'first': 2, 'second': 6}}
# print('奇数' in dict.values()) #打印得False
# 11.获取所有的键值对 dict.items(),返回的是类列表 eg:
# dict={'奇数': 1, '偶数': {'first': 2, 'second': 6}}
# print(dict.items())
# 打印得:dict_items([('奇数', 1), ('偶数', {'first': 2, 'second': 6})])
# 字典的常用操作 --字典的合并 也经常用作字典的新增 dict.update(字典) eg:
# dict1={'one':5,'two':2}
# dict2={'re':6,'al':6} #字典2可以命名,也可以直接加到下面的update中
# dict1.update(dict2) #直接用update(合并要合并的字典内容)
# print (dict1) #打印得:{'one': 5, 'two': 2, 're': 6, 'al': 6}
# -- 3 字典的遍历
# 字典的for循环本质是对键进行操作的
# dict={'one': 5, 'two': 2, 're': 6, 'al': 6}
# for one in dict:
# print(one) #循环得到的是键:one two r al
# for one in dict.items():
# print(one,end=' ') #打印得:('one', 5) ('two', 2) ('re', 6) ('al', 6)
# 以上又是对键值对进行循环,由此可见,for是根据循环对象来进行循环的
# 上面的for循环中吧one替换成a,b可行吗?
# dict={'one': 5, 'two': 2, 're': 6, 'al': 6}
# for a,b in dict.items():
# print(a,b,end=' ') #打印得:one 5 two 2 re 6 al 6
# -- 3 字典的使用
# 不同的数据类型,各有各的用途
# 一些简单的数据,无需字典,列表就可以了
# 字典是无序的,如果需要按顺序,则不能使用字典
# 扩展内容:json和字典的区别以及转换
# 1.json--是一种字符串 数据必须用双引号
# 字典--是一种数据类型
# 2.import json json.dumps() 字典转换成json eg:
# import json #使用json需要先调用json
# dict={'one':5,'two':2} #是一个字典
# print(json.dumps(dict)) #打印得:{"one": 5, "two": 2}
# 3.json.loads() json转成字典,改变的是原数据类型
# 原因是字符串不能改数据,可以改成字典再改数据,然后再转成字符串
# jso1='''{"one": "5",
# "two": 2
# }''' #是一个json字符串,比字典多了两个引号
# print(type(jso1)) #打印得:<class 'str'>
# dict=json.loads(jso1) #json转字典用loads(),字典转json()用dumps()
# print(dict) #打印得:{'one': 5, 'two': 2},
# print(type(json.loads(jso1))) #打印得<class 'dict'>
# dict['one']='6'
# print(dict) #打印得:{'one': '6', 'two': 2},数据改好了,现在要转回字符串了
# str11=json.dumps(dict) #注意:dumps()和loads()前面都是json
# print(type(str11)) #打印得:<class 'str'>