龙空技术网

测开不得不会的python之字典dict

科雷软件测试 298

前言:

此刻朋友们对“python dict比较”大体比较关切,兄弟们都想要学习一些“python dict比较”的相关资讯。那么小编在网上网罗了一些关于“python dict比较””的相关文章,希望小伙伴们能喜欢,各位老铁们快快来学习一下吧!

***原创不易,欢迎大家收藏关注,感谢对作者的鼓励***

文档目录

字典是可变数据类型 1

使用dict()和zip()函数可以将可迭代对象转换为列表 2

使用defaultdict()函数 3

字典的For循环 4

字典的copy功能 5

字典推导式 6

字典合并 7

使用json.loads()和json.dumps()将json字符串和字典相互转换 8

Dict是python中的字典,字典使用花括号{}表示,存放key和value的键值对,每个键值 对key:value 用冒号 : 分割,每个键值对之间用英文逗号 ‘,’ 分割。

字典跟列表一样也是可变的数据类型,可对字典执行添加、修改、删除等操作。

字典是可变数据类型

#第1步:定义一个字典number_dictA = {"name":"lily","age":21,"color":"red"}#查看字典的内存地址print(id(number_dictA)) 4451238336#第2步:将变量赋值给另一个变量number_dictB = number_dictA#第3步:在字典B添加键值对number_dictB["sex"] = "man"#打印字典Bprint(number_dictB){'name': 'lily', 'age': 21, 'color': 'red', 'sex': 'man'}#第4步:查看字典B的内存地址print(id(number_dictB))4451238336#两次打印的内存地址是同一个,说明number_dictA和number_dictB指向同一个字典对象。修改任意一个字典其实修改的都是同一个对象

尤其是在使用函数传递列表参数时要注意,列表在函数中如果被修改,该列表指向的对象会被修改,所以一般为了防止字典在函数引用时被修改,通常可以使用函数copy.deepcopy()深拷贝功能在函数内定义一个新的对象,详细说明见下方介绍。

使用dict()和zip()函数可以将可迭代对象转换为列表

listA = ['name','age','sex']listB = ['lili',21,'man']
#使用zip() 和dict()函数生成字典print(dict(zip(listA,listB)))
#打印结果如下:{'name': 'lili', 'age': 21, 'sex': 'man'}
使用defaultdict()函数

对于一个空字典来说,如果直接做使用循环做加法的操作会报错

举例:

dictA = {}dictA['key1'] += 1#执行时会报错 因为事先没有定义键值Traceback (most recent call last):File "test.py", line 65, in <module>dictA['key1'] += 1KeyError: 'key1'

使用collections包里带的defaultdict函数即可解决上面的问题

from collections import defaultdictdictA = defaultdict(int) #定义默认值为int型数据dictA['key1'] += 1#此时执行不会报错,打印结果如下print(dictA['key1'])1
字典的For循环使用dict.keys()循环字典的keys
for key in number_dictB.keys():	print(f'键值为:{key}')#打印结果如下键值为:name键值为:age键值为:color键值为:sex
使用dict.values()循环字典的values
for value in number_dictB.values():	print(f'value为:{value}')#打印结果如下value为:lilyvalue为:21value为:redvalue为:man
使用dict.items()循环字典的键值对
for key,value in number_dictB.items():	print(f'键值为:{key} value为:{value}')#打印结果如下键值为:name value为:lily键值为:age value为:21键值为:color value为:red键值为:sex value为:man

字典的copy功能

dictA = {"name":"lily","age":21,"color":"red","extend_fields":{"movie":[u'泰坦尼克号']}}print(f'字典dictA 内存地址 : {id(dictA)}')print(f'字典dictA的‘extend_fields’对应的值的 内存地址 : {id(dictA["extend_fields"])}')#使用dict.copy()函数复制字典给另一个变量dictB = dictA.copy()print(f'字典dictB 内存地址 : {id(dictB)}')print(f'字典dictB的‘extend_fields’对应的值的 内存地址 : {id(dictB["extend_fields"])}')#结果如下:dictA和dictB的内存地址不同,但是字典内最后一个元素的内存地址还是一样,字典dictA 内存地址 : 4515690432字典dictA的‘extend_fields’对应的值的 内存地址 : 4515676672字典dictB 内存地址 : 4515918336字典dictB的‘extend_fields’对应的值的 内存地址 : 4515676672表示虽然用了copy功能,但是只是最外层的字典对象复制为另一个对象,但是字典内的嵌套字典指向的还是同一个对象。#如果想全部复制字典的所有元素的对象,可以使用copy.deepcopy()深拷贝功能import copydictC = copy.deepcopy(dictA)print(f'字典dictC 内存地址 : {id(dictC)}')print(f'字典dictC的‘extend_fields’对应的值的 内存地址 : {id(dictC["extend_fields"])}')#结果如下: 嵌套元素字典指向的对象也不再相同字典dictC 内存地址 : 4515719232字典dictC的‘extend_fields’对应的值的 内存地址 : 4516008640
字典推导式

字典推导式和列表推导式类似,也是通过循环和条件判断表达式配合使用,不同的是字典推导式返回值是一个字典,需要使用花括号{}表示。

语法1:{key_exp:value_exp for key, value in dict.items() if condition}

dictA = {'key1': 100, 'key2': 99, 'key3': 98}listA = ['key1','key2']#挑选dictA中在listA的key对应的value,并做加1的操作dictB = {key:value+1 for key,value in dictA.items() if key in listA}print(dictB){'key1': 101, 'key2': 100}

语法2:{key_exp:value_exp1 if condition else value_exp2 for key, value in dict.items()}

dictA = {'key1': 100, 'key2': 99, 'key3': 98}listA = ['key1','key2']#挑选dictA中在listA的key对应的value,并做加1的操作,不满足的key对应的value做+2的操作dictB = {key:value+1 if key in listA else value+2 for key,value in dictA.items()}print(dictB){'key1': 101, 'key2': 100, 'key3': 100}
字典合并
dictA = {'key1': 100, 'key2': 99, 'key3': 98}dictB = {'key4': 100, 'key5': 99, 'key6': 98}第1种方法:dictC= {**dictA,**dictB}print(dictC)第2种方法:dictD={}dictD.update(dictB)dictD.update(dictA)print(dictD)第3种方法:dictE=dict(dictA,**dictB)print(dictE)第4种方法:dictF=dict(list(dictA.items())+list(dictB.items()))print(dictF)第5种方法:借助itertools.chain()import itertoolsdictG = dict(itertools.chain(dictA.items(), dictB.items()))print(dictG)
使用json.loads()和json.dumps()将json字符串和字典相互转换
#导入json包import json#定义一个字典dictA = {"name":"lily","age":21,"color":"red","extend_fields":{"movie":[u'泰坦尼克号']}}#使用json.dumps将字典转换为json字符串strA = json.dumps(dictA)print(type(strA))#结果如下<class 'str'>#将json字符串转化为字典dictB = json.loads(strA)print(type(dictB))#结果如下<class 'dict'># 日常写代码中经常会使用isinstance()函数事先判断对象类型,然后再进一步处理。#判断strA变量为字符串类型  将strA转为字典if isinstance(strA,str):	dictC = json.loads(strA)	print(f'dictC 类型 : {type(dictC)}')#判断dictC变量为字典类型  将dictC转为json字符串if isinstance(dictC, dict):	strB = json.dumps(dictC)	print(f'strB 类型 : {type(strB)}')

标签: #python dict比较 #pythondictinkeys