字典函数函数fromkeys的容器类型(字典、集合)相关函数高级使用fromkeys批量创建键值对,并设置默认值pop指定键删除指定键值对,返回指定键对应的值。popitem删除最后一个键值对,并以元组的形式返回删除的键值对。clear清空字典,返回Noneupdate批量更新获取查找数据,获取指定键keys的值将字典中的键组合成一个新的可迭代对象values将字典中的值组合成新的可迭代对象items组合字典中的键值对组成元组,形成一个新的可迭代对象fromkeys将一个容器中的所有元素作为字典的键,并设置默认值,批量创建键值对lst=['key0','key1','key2']dct={}.fromkeys(lst,None)print(dct)#{'key0':None,'key1':None,'key2':None}但我们必须支付注意一个问题,因为这些键值对的值都来自同一个内存地址。如果我们设置的默认值是可变数据类型,那么修改其中一个值就会改变所有键值的值,这是灾难性的。的。lst=['key0','key1','key2']dct={}.fromkeys(lst,[1])print(dct)#{'key0':[1],'key1':[1],'key2':[1]}#我们只修改了key0的值,但是使用fromkeys创建的所有数据都被修改了dct['key0'][0]=2print(dct)#{'key0':[2],'key1':[2],'key2':[2]}所以我们一般可以设置默认值为None,因为None默认开辟一个小数据池的地址,永远不会变,None表示没什么,而且内存地址的占用是唯一一致的。当None变成任意数据类型时,就不用担心一起修改其他的Nones了。类似的数据类型还有1、2等数字类型,这些数据类型的特点是有内存缓存机制作为保护。具体参见内存缓存机制。lst=['key0','key1','key2']dct={}.fromkeys(lst,None)print(dct)#{'key0':None,'key1':None,'key2':None}dct['key0']='msr20666'print(dct)#{'key0':'msr20666','key1':None,'key2':None}pop通过key删除指定的键值对,如果有isnosuchkey会报错,但是可以设置默认值,防止因为找不到指定的key而报错。#指定key0删除dct={'key0':None,'key1':None,'key2':None}dct.pop('key0')print(dct)#{'key1':None,'key2':None}#指定key4删除,但是没有这个key会报错#dct.pop('key4')#error#指定默认值防止出错res=dct.pop('key4','Thereisnosuchkey')print(dct)#{'key1':None,'key2':None}print(res)#没有这个键popitem删除最后一个键值对。dct={'one':1,'two':2,'three':3}dct.popitem()print(dct)#{'one':1,'two':2}清空字典dct={'one':1,'two':2,'three':3}dct.clear()print(dct)#{}update用于批量更新字典的key,如果key存在则更新对应value,如果键不存在,则创建一个新的键值对。#方法一:定义一组新的字典,然后将新的字典添加到旧的字典中(推荐)dct={'one':1,'two':2,'three':3}new_dct={'one':11,'二':22,'六':666}dct。update(new_dct)print(dct)#{'one':11,'two':22,'three':3,'six':666}#方法二:直接更新函数中的键值对(不是recommended)'''在函数中直接使用关键字参数更新字典键值对,关键字代表键,对应的值就是值;缺点是关键字的命名与变量的命名相同。例如,你不能以数字开头,所以如果字典键是一个整数,你就不能修改它对应的值。'''dct={1:1,2:2,'one':1,'two':2}#关键字的名称不能以数字开头,所以key为整数的键值对不能被修改#所以这也是为什么建议按照变量名标准命名键名的原因之一#dct.update(1=1)#errordct.update(one=11)print(dct)#{1:1,2:2,'one':11,'two':2}#一次可以修改多个值dct.update(one=111,two=22,three=33)print(dct)#{1:1,2:2,'one':111,'two':22,'three':33}get查找数据,指定key获取对应的valuedct={'one':1,'two':2,'three':3}#指定获取数据的keyres=dct.get('one')print(res)#1#如果没有这样的key,返回Noneres=dct.get('six')print(res)#None#可以设置默认值,如果找不到数据,则返回默认值res=dct.get('six','Thiskeywasnotfound')print(res)#Thiskeywasnotfound#也可以直接指定key查看对应数据,but如果没有这个key,会直接报错。#res=dct['six']#error找不到数据键。字典的键被组成一个名为dict_keys的可迭代对象。这是一种特殊的数据类型,可以强制成为其他数据类型。dct={'一':1,'二':2,'三':3}res=dct.keys()print(res)#dict_keys(['一','二','三'])打印(type(res))#items将字典中的键值对一一组合成元组,形成一个称为dict_items的可迭代对象。dct={'一':1,'二':2,'三':3}res=dct.items()print(res)#dict_items([('一',1),('二',2),('three',3)])print(type(res))#集合的相关函数函数函数add向集合中添加数据,一次只能添加一个,returnnoneupdate在集合中迭代添加数据,一次可以添加多个,返回Nonepop随机删除集合中的一条数据,返回删除的值remove删除集合中指定的一个值,如果值不对存在,报错,返回Nonediscard删除集合中指定的一个值,如果这个值不存在,则不报错,返回Noneclear清除集合intersectionreturnintersectiondifferencereturndifferencesetunionreturnunionsymmetric_difference返回对称差setorcomplementissuperset判断是否为指定集合的??父集合issubset判断是否为指定集合的??子集isdisjoint判断两个集合是否不相交()frozenset强制容器变成冻结集合类型collection增删改查集合是无序数据,所以不能进行查找和修改操作;add分别向集合中添加数据setvar={1,2,3,'hello','msr','msr20666'}setvar.add('motherland')print(setvar)#{1,2,3,'motherland','hello','msr20666','msr'}更新迭代添加的数据集var={1,2,3,'hello','msr','msr20666'}lst=('china','america','russia')setvar.update(lst)print(setvar)#{1,2,3,'msr','america','russia','china','hello','msr20666'}pop随机删除一个数据setvar={1,2,3,'hello','msr','msr20666'}setvar.pop()print(setvar)#{2,3,'msr','msr20666','hello'}remove删除集合中指定的一个值,如果该值不存在,会报错setvar={1,2,3,'hello','msr','msr20666'}setvar.remove('hello')print(setvar)#{1,2,3,'msr','msr20666'}setvar.remove(4)#错误,这个值不存在。discard删除集合中指定的值。如果这个值不存在,则不会报错。setvar={1,2,3,'hello','msr','msr20666'}setvar.discard('hello')print(setvar)#{1,2,3,'msr20666','msr'}res=setvar.discard(4)print(res)#Noneclear空集合setvar={1,2,3,'hello','msr','msr20666'}setvar.clear()print(setvar)#set()setcross和complementintersection交集,即两组相同的数据,两组的交集相同,简写&set0={1,2,3,4,5,6}set1={1,2,3,7,8,9,0}res=set0.intersection(set1)print(res)#{1,2,3}res=set1&set0print(res)#{1,2,3}差差集,differenceset就是两组中不同的数据,注意两组中的differenceset是不同的,简写-set0={1,2,3,4,5,6}set1={1,2,3,7,8,9,0}res=set0.difference(set1)print(res)#{4,5,6}res=set1-set0print(res)#{0,8,9,7}unionunion是两个集合的所有数据,但是只会有一个交集部分,两个集合的并集相同,缩写使用使用|set0={1,2,3,4,5,6}set1={1,2,3,7,8,9,0}res=set0.union(set1)print(res)#{0,1,2,3,4,5,6,7,8,9}res=set1|set0print(res)#{0,1,2,3,4,5,6,7,8,9}symmetric_differencedifferenceset是两个set除了并集之外的数据,也就是两个set的differenceset.两组的对称差集相同。缩写使用^set0={1,2,3,4,5,6}set1={1,2,3,7,8,9,0}res=set0.symmetric_difference(set1)print(res)#{0,4,5,6,7,8,9}res=set1^set0print(res)#{0,4,5,6,7,8,9}补集,如果有两个集合,其中一个包含所有另一个集合的数据,那么这个集合就是另一个集合的父集合,反之就是一个子集,父集合中的子集中不存在的数据就是子集的补集set0={1,2,3,4,5,6,7,8}set1={1,2,3,4}res=set0.symmetric_difference(set1)print(res)#{8,5,6,7}res=set1.symmetric_difference(set0)print(res)#{5,6,7,8}isperset判断是否属于指定集合Superset,返回布尔值,简写使用>或=+set0={1,2,3,4,5,6,7,8}set1={1,2,3,4}res=set0.issuperset(set1)print(res)#Trueres=set1>set0print(res)#Falseres=set1>=set0print(res)#Falseissubset判断是否是指定集合的??子集,返回一个布尔值。使用<或<=set0={1,2,3,4,5,6,7,8}set1={1,2,3,4}res=set0.issubset(set1)print(res)#Falseres=set1fzs1=frozenset(lstvar)print(fzs1)#frozenset({1,2,3,4,5})print(type(fzs1))#冻结的集合无法添加、删除、修改和查看。fzs0.clear()#error可以用来交叉补res=fzs0.issuperset(fzs1)print(res)#false冻结的集合没有办法解冻,但是可以转换成其他数据类型,比如使用set函数将冻结的集合变成普通集合。lst=set(fzs1)print(setvar)为什么setcrossunioncomplementoperator的缩写?简单来说,交并补和位运算的本质是一样的。交集和补运算符号相同的地方,按位交和&保留,并按位或\两者之间的一切都保留,对称差按位互斥或^两者除外,其余保留