失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > collections的defaultdict使用

collections的defaultdict使用

时间:2024-02-01 12:27:05

相关推荐

collections的defaultdict使用

defaultdict

defaultdict 是 dict 类型的子类,正如其名,初始化时,可以给key指定默认值。

如果是普通的dict对象,访问一个不存在的key时,会报错:

dict1 = dict()print(dict1['a'])

KeyError: 'a'

而使用defaultdict,dict中不存在key ,会输出默认的初始值,例如,设置默认空列表dict,返回也是[]:

from collections import defaultdictres1 = defaultdict(list)print(res1['a']) # []print(res1.get('a')) # []print(res1.get('a', 'hello world 1')) # []

默认给一个0的dict:

from collections import defaultdictres2 = defaultdict(int)print(res2['a']) # 0print(res2.get('a')) # 0print(res2.get('a', 'hello world 2')) # 0

defaultdict方法接收的参数是一个可调用对象,可以简单理解为一个函数对象,我们知道python中一切皆对象,int、list本来以上一个函数对象,这里如果想要默认值不是0,而是999,该怎么处理呢?

使用匿名函数,指定defaultdict默认值

from collections import defaultdictres3 = defaultdict(lambda: 999)print(res3['b']) # 999print(res3.get('b')) # 999print(res3.get('b', 0)) # 999

当然也可以使用自定义函数,指定defaultdict默认值:

from collections import defaultdictdef get_default():return 'Hello World !'res4 = defaultdict(get_default)print(res4['b']) # Hello World !print(res4.get('b')) # Hello World !print(res4.get('b', 0)) # Hello World !

关于defaultdict的一些应用场景:

场景一:我们经常想要将一个列表中的数据进行整合,比如这种:

initial_data = [('class1', '张三'), ('class2', '李四'), ('class1', '王五'),('class3', '赵六'), ('class3', '李刚弹'), ('class2', '王大炮'),('class1', '王大锤'), ('class2', '李二狗'), ('class1', '佚名')]

变成:

finally_data = {'class1': ['张三', '王五', '王大锤', '佚名'],'class2': ['李四', '王大炮', '李二狗', ],'class3': ['赵六', '李刚弹']}

如果自己实现的话可能会用for循环依次判断,又或者使用到setdefault方法也可以。这里如果使用defaultdict方法算是一种比较优雅的解决:

res5 = defaultdict(list)for k, v in initial_data:res5[k].append(v)print(res5 == finally_data) # True}

附:使用setdefault也可以优雅的解决

res6 = {}for k, v in initial_data:res6.setdefault(k, []).append(v)print(res6 == finally_data) # True

参考:

/thsk/p/8404425.html

如果觉得《collections的defaultdict使用》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。