当前位置: 首页 > 后端技术 > Python

dict和set的15个经典用法实例

时间:2023-03-25 23:29:26 Python

大家好,我是越创。最近在写一本书,估计会挺长的。今天查看更新。今天,学习15个使用字典和集合的例子。公众号原文:https://mp.weixin.qq.com/s/WwJdPebK_hFocS1lk7MWhA1。update实际使用字典时,需要将键值对批量插入到已有字典中,使用update方法实现批量插入。将键值对批量插入现有字典:In[23]:d={'a':1,'b':2}#Method1In[24]:d.update({'c':3,'d':4,'e':5})In[25]:dOut[25]:{'a':1,'b':2,'c':3,'d':4,'e':5}#方法2In[31]:d={'a':1,'b':2}...:d.update([('c',3),('d',4),('e',5)])#实现方法1一样的效果In[32]:dOut[32]:{'a':1,'b':2,'c':3,'d':4,'e':5}#方法3In[33]:d={'a':1,'b':2}...:d.update([('c',3),('d',4)],e=5)#实现方法1一样的效果In[34]:dOut[34]:{'a':1,'b':2,'c':3,'d':4,'e':5}2.如果setdefault只有在字典中不存在键值对时才插入字典;如果存在,则不需要插入(不会修改键值对)。这种场景下,使用字典自带的方法setdefault:In[35]:d={'a':1,'b':2}In[36]:r=d.setdefault('c',3)#r:3In[37]:rOut[37]:3In[38]:dOut[38]:{'a':1,'b':2,'c':3}In[39]:r=d.setdefault('c',33)#r:3,'c':3的键值对已经存在,所以setdefault时d不会改变In[40]:rOut[40]:3In[41]:dOut[41]:{'a':1,'b':2,'c':3}3。Dictionaryunion我们先来看这个函数f。为了便于理解,参数类型和返回值类型都显示出来了,这不是必须的。在[45]中:deff(d:dict)->dict:...:return{**d}...:在[46]中:f({'a':1,'b':2})Out[46]:{'a':1,'b':2}{**d1,**d2}合并d1和d2并返回一个新字典:In[47]:defmerge(d1,d2):...:return{**d1,**d2}In[48]:merge({'a':1,'b':2},{'c':3})Out[48]:{'a':1,'b':2,'c':3}下面是示意图:4.DictionarydifferenceIn[51]:defdifference(d1,d2):...:returndict([(k,v)fork,vind1.items()ifknotind2])In[53]:difference({'a':1,'b':2,'c':3},{'b':2})Out[53]:{'a':1,'c':3}5.按键排序In[54]:defsort_by_key(d):...:returnsorted(d.items(),key=lambdax:x[0])...:In[55]:sort_by_key({'a':3,'b':1,'c':2})Out[55]:[('a',3),('b',1),('c',2)]排序函数返回一个列表,元素是元组:6.按值排序的原理和按键排序是一样的。按值排序时,关键函数定义为按值比较(x[1])。照顾小白,解释一下为什么是x[1]。d.items()返回一个可迭代类型(Iterable),其元素为(key,value)。key函数的参数x是元素(key,value),所以x[1]得到的是字典的值。在[59]中:defsort_by_value(d):...:returnsorted(d.items(),key=lambdax:x[1])...:In[60]:sort_by_value({'a':3、'b':1,'c':2})Out[60]:[('b',1),('c',2),('a',3)]7.Maximumkeypassedkeys获取所有key,获取最大key,返回(maximumkey,value)元组sIn[68]:defmax_key(d):...:iflen(d)==0:...:return[]...:max_key=max(d.keys())...:return(max_key,d[max_key])In[69]:max_key({'a':3,'c':3,'b':2})Out[69]:('c',3)8.字典值最大的字典,可能有很多对:In[70]:defmax_key(d):...:iflen(d)==0:...:return[]...:max_val=max(d.values())...:return[(key,max_val)forkeyindifd[key]==max_val]...:In[71]:max_key({'a':3,'c':3,'b':2})Out[71]:[('a',3),('c',3)]9.设置最大值找到集合中的最大值和最小值,放入元组中返回:In[76]:defmax_min(s):...:return(max(s),min(s))在[77]中:max_min({1,3,5,7})Out[77]:(7,1)10。如果组成字符串的所有字符只出现一次,则调用单个字符串。作为单个字符串。In[73]:defsingle(string):...:returnlen(set(string))==len(string)In[74]:single('love_python')#FalseOut[74]:FalseIn[75]:single('python')#TrueOut[75]:True11。longersetkey函数定义为根据元素的长度比较大小找到一个更长的集合:In[78]:deflonger(s1,s2):...:returnmax(s1,s2,key=lambdax:len(x))...:In[79]:longer({1,3,5,7},{1,5,7})#{1,3,5,7}Out[79]:{1、3、5、7}12。Repeatatmost在两个列表中,找到重叠最多的元素。默认只返回一个。解决思路:求两个列表的交集遍历交集列表中的每一个元素,min(元素在列表1中的次数,元素在列表2中的次数),就是这个元素的重叠次数找到[80]中的最大重叠数:defmax_overlap(lst1,lst2):...:overlap=set(lst1).intersection(lst2)...:ox=[(x,min(lst1.count(x),lst2.count(x)))forxinoverlap]...:returnmax(ox,key=lambdax:x[1])In[81]:max_overlap([1,2,2,2,3,3],[2,2,3,2,2,3])Out[81]:(2,3)以下三种情况有些难度。对于初学者,您可以先跳过它们。13.topn键查找字典中的前n个最大值和对应的键。导入Python内置模块heapq中的nlargest函数,获取字典中的前n个最大值。key函数定义按值比较大小:In[82]:fromheapqimportnlargestIn[83]:deftopn_dict(d,n):...:returnnlargest(n,d,key=lambdak:d[k])In[84]:topn_dict({'a':10,'b':8,'c':9,'d':10},3)Out[84]:['a','d','c']14.一键转多值字典一键转多值的实现方法1、按照常规思路,一步一步来:In[85]:d={}...:lst=[(1,'apple'),(2,'orange'),(1,'compute')]...:fork,vinlst:...:ifknotind:...:d[k]=[]...:d[k].append(v)In[86]:dOut[86]:{1:['apple','compute'],2:['orange']}上面的方法有一个if判断,确认k是否已经在返回的结果字典d中。不是很优雅!您可以使用collections模块中的defaultdict,它创建一个具有自己初始值的类型的字典。使用起来更方便:在[87]中:fromcollectionsimportdefaultdict...:...:d=defaultdict(list)...:fork,vinlst:...:d[k]。append(v)In[88]:dOut[88]:defaultdict(list,{1:['apple','compute'],2:['orange']})15.逻辑合并字典方法:In[94]:dic1={'x':1,'y':2}In[95]:dic2={'y':3,'z':4}In[96]:merged={**dic1,**dic2}In[97]:mergedOut[97]:{'x':1,'y':3,'z':4}修改merged['x']=10,dic1中x的值不变,merged是重新生成的“新字典”。但是collections模块中的ChainMap函数不同,它在内部创建了一个列表来存放这些字典。使用ChainMap合并字典,修改merged['x']=10后,dic1中x的值发生变化。如下:In[98]:fromcollectionsimportChainMapIn[94]:dic1={'x':1,'y':2}In[95]:dic2={'y':3,'z':4}In[99]:merged=ChainMap(dic1,dic2)In[100]:mergedOut[100]:ChainMap({'x':1,'y':2},{'y':3,'z':4})In[101]:merged['x']=10In[102]:dic1#改变,共享内存的结果Out[102]:{'x':10,'y':2}今天总结跟大家学了15个字典和集合相关的案例,难度不一。例如,需要区分逻辑合并词典和普通合并词典;键函数通常与lambda匿名函数结合使用。研究完这些案例,我相信我会掌握的。还是建议敲一遍代码,理解会更深。C++资料奥赛题解法,长期更新!中小学信息奥林匹克培训,VX:JiabcdefhAI悦创·俱乐部技能,包括《Python语言,C++,算法/数据结构,少儿编程,pygame游戏开发》,V:Jiabcdefh欢迎交流学习。方法一:QQ方法二:微信:Jiabcdefh