Dictionary是日常使用频率较高的数据类型,经常会遇到判断key是否在字典中的情况。这个时候我们是不是按照下面的代码来写:d=dict()if'key'ind:d['key']+=1else:d['key']=0print(d['key'])#1我们需要在每次进行相关操作之前进行判断。但是,当我们使用defaultdict时,我们可以懒惰地简化ifelse的格式:fromcollectionsimportdefaultdictd=defaultdict(int)d["key"]+=1print(d['key'])#1关于defaultdict的大部分日常使用defaultdict的场景就是上面的例子,目的是为了减少ifelse的判断。当然除了默认的int初始化之外,还有一个无脑的append操作就是在list中添加d=defaultdict(list)。然而,我们有没有挖掘过defaultdict的其他场景?我们先看一下它的源码:在源码注释中,简单的说明了当callkey不存在时,可以使用default_factory参数来生成一个新的值。def__init__(self,default_factory=None,**kwargs):#knowncaseof_collections.defaultdict.__init__"""defaultdict(default_factory=None,/,[...])-->dictwithdefaultfactory默认工厂当键不存在时,在不带参数的情况下被调用以产生新值,仅在__getitem__中。默认字典比较等于具有相同项目的字典。所有剩余参数的处理方式与传递给字典构造函数的方式相同,包括keywordarguments.#(copiedfromclassdoc)"""pass例如上面我们的defaultdict(int)中key不存在时,默认赋值为0。d=defaultdict(list)当key不存在时,默认给value赋一个空列表。听上去好像是这个功能……现在我们换个场景,以学生每周的比赛为例。大家在参加周赛的时候,会根据我们比赛的结果进行评分。如果是第一次参加比赛,因为没有初始积分,不宜从0分开始。所以每个玩家的初始基准分为1500分。这样一来,本场比赛的表现就可以考虑根据选手的成绩来加分了。我们来看看默认字典的代码应该如何操作:scores=dict()add_score=10#方法1if'xiaoming'inscores:scores['xiaoming']+=add_scoreelse:scores['xiaoming']=1500+add_score#方法2scores['xiaoming']=scores.get('xiaoming',1500)+add_score现在我们想使用defaultdict,但是如果defaultdict赋值是int值,就没有办法提供这个benchmarkscore。我们应该做什么?至此,我们应该对default_factory有了更深的了解,它不仅支持我们传入默认的int和list,还支持我们使用自定义函数。fromcollectionsimportdefaultdictdefdiy_func():print("inituserscore.")return1500scores=defaultdict(diy_func)scores['xiaoming']+=10print(scores['xiaoming'])#inituserscore.#1510wepassed为default_factory分配一个自定义函数来帮助我们初始化用户的分数。但是这个自定义函数的方法太简单了,能再简化一下吗?此时我们应该考虑lambda表达式!scores=defaultdict(lambda:1500)scores['xiaoming']+=10print(scores['xiaoming'])这样是不是更简洁方便。你觉得这个操作好看吗?但是,我们注意到defaultdict的__init__方法有一个**kwargs**参数,我们还没有用到!也可以这样玩:fromcollectionsimportdefaultdictdata=defaultdict(xiaozhang=1600,xiaowang=1700)scores=defaultdict(lambda:1500,data)scores['xiaoming']+=10scores['xiaowang']-=15print(scores.items())#dict_items([('xiaozhang',1600),('xiaowang',1685),('xiaoming',1510)])所以defaultdcit可以在使用default_factory的基础上导入初始字典。是不是比较滑?关于default_dict的内容,今天就学习到这里,希望对大家有所帮助。
