当前位置: 首页 > 科技观察

Python字典高效使用一览

时间:2023-03-12 22:54:14 科技观察

字典(dict)对象是Python中最常用的数据结构。社区中有人开玩笑说:“Python试图用字典加载整个世界。”字典在Python中的重要性不言而喻例如,这里罗列了几个高效使用字典的方法,希望Python开发者在日常应用开发中合理使用,让代码更Python化。1.使用in关键字检查key是否存在。Python禅宗中有一种开发哲学:应该有一种——最好只有一种——显而易见的方法来做到这一点。尝试找到一个,***是唯一一个明显的解决方案。在Python2中,可以使用has_key方法来判断字典中是否存在一个key。另一种方法是使用in关键字。但是强烈推荐使用后者,因为in的处理速度更快。另一个原因是has_key方法在Python3中被移除了。如果你想同时兼容py2和py3版本的代码,使用in是最好的选择。badd={'name':'python'}ifd.has_key('name'):passgoodif'name'ind:pass2。使用get获取字典中的值。获取字典中值的一种简单方法是使用d[x]访问元素,但在这种情况下,如果key不存在,则会报KeyError错误。当然,在获取key之前可以使用in操作先检查key是否在字典中,但是这种方法不符合Python的禅宗:简单胜于复杂。扁平比嵌套好。好的代码应该简单易懂,扁平化的代码结构更具可读性。而不是if...elsebadd={'name':'python'}if'name'ind:print(d['hello'])else:print('default')goodprint(d.get("name",“默认”))3。使用setdefault为字典中不存在的key设置默认值data=[("animal","bear"),("animal","duck"),("plant","cactus"),("vehicle","speedboat"),("vehicle","schoolbus")]在做分类统计的时候,希望将同一类型的数据归到字典中的某一类中,比如上面的代码将以列表的形式获取新字典groups={}>>>{'plant':['cactus'],'animal':['bear','duck'],'vehicle':['speedboat','schoolbus']正常的做法是先判断key是否已经存在,如果不存在,先用list对象初始化,再进行后续操作。更好的方法是使用字典中的setdefault方法。badfor(键,值)indata:ifkeyingroups:groups[key].append(value)else:groups[key]=[value]goodgroups={}for(key,value)indata:groups.setdefault(key,[]).append(value)setdefault的作用是:如果字典中存在key,则直接返回对应的value,相当于get方法。如果字典中不存在该键,则setdefault中的第二个参数将作为键值,然后返回该值。4.使用defaultdict初始化字典对象。如果不想让d[x]在x不存在时报错,除了在获取元素时使用get方法外,还有一种方法是在collections模块中使用defaultdict来指定初始化字典时的一个函数,在事实上defaultdit是dict的一个子类。fromcollectionsimportdefaultdictgroups=defaultdict(list)for(key,value)indata:groups[key].append(value)当key在字典中不存在时,会调用list函数返回一个空列表赋值给d[key],所以一旦来了,就不用担心调用d[k]会报错了。5.使用fromkeys将列表转换为字典keys={'a','e','i','o','u'}value=[]d=dict.fromkeys(keys,value)print(d)>>>{'i':[],'u':[],'e':[],'a':[],'o':[]}6.实现switch...case语句withdictionaryPython中没有switch...case语句。Python之父桂叔说,这个语法过去没有,现在没有,将来也不会存在。因为Python简洁的语法可以用if...elif来实现。如果分支判断太多,也可以用字典代替。ifarg==0:return'zero'elifarg==1:return'one'elifarg==2:return"two"else:return"nothing"gooddata={0:"zero",1:"one",2:"two",}data.get(arg,"nothing")7.使用iteritems迭代字典中的元素。Python提供了几种迭代字典中元素的方法。第一种是使用items方法:d={0:"zero",1:"one",2:"two",}fork,vind.items():print(k,v)items方法返回一个由(key,value)组成的list对象,这种方式的缺点是在迭代一个大字典的时候,内存会瞬间膨胀两倍,因为list对象会一次性加载所有元素到内存中。更好的方法是使用iteritemsfork,vind.iteritems():print(k,v)iteritemsreturn重要的是迭代器对象。迭代器对象具有延迟加载的特点,只有在真正需要的时候才产生值。这种方法在迭代过程中不需要额外的内存来加载数据。注意在Python3中只有items方法,相当于Python2中的iteritems,去掉了方法名iteritems。8.用字典理解理解是一件美妙的事情。listcomprehension一出来,map、filter等函数就黯然失色了。从Python2.7及更高版本开始,此功能已扩展到字典和集合。无需调用dict构造字典对象的方法。badnumbers=[1,2,3]d=dict([(number,number*2)fornumberinnumbers])goodnumbers=[1,2,3]d={number:number*2fornumberinnumbers}