Python中的defaultdict

1 方法产生的原因

当我们在解决类似以下的问题时;在Python中如果访问字典中不存在的键,会引发KeyError异常(JavaScript中如果对象中不存在某个属性,则返回undefined)

#求出对应key的个数时:
names = ['jaden','jomle','jalen','summer','jomle','jalen']
解法1:

通常解法:

需要给定一个暂存的地方

names = ['jaden','jomle','jalen','summer','jomle','jalen']
count = {}
for name in names:
	if name not in count:
		count[name] = 0
	count[name] += 1
print(count)
====================================
{'jaden': 1, 'jomle': 2, 'jalen': 2, 'summer': 1}
解法二:直接给定默认值
names = ['jaden','jomle','jalen','summer','jomle','jalen']
count = {}
for name in names:
	count.setdefault(name, 0)
	count[name] += 1
print(count)
===================================
{'jaden': 1, 'jomle': 2, 'jalen': 2, 'summer': 1}

通过解法2 : 我们给字典set默认值,减少判断,极大的提高代码的优雅性。以及可读性。

解法三 : 通过defaultdict的方法
names = ['jaden','jomle','jalen','summer','jomle','jalen']
from collections import defaultdict
count = defaultdict(lambda: 0)
for name in names:
	count[name] += 1
print(dict(count))
====================================
{'jaden': 1, 'jomle': 2, 'jalen': 2, 'summer': 1}

​ defaultdict类除了接受类型名称作为初始化函数的参数之外,还可以使用任何不带参数的可调用函数,到时该函数的返回结果作为默认值,这样使得默认值的取值更加灵活。下面用一个例子来说明,如何用自定义的不带参数的函数zero()作为defaultdict类的初始化函数的参数:

>>> from collections import defaultdict
>>> def zero():
...     return 0
...
>>> dd = defaultdict(zero)
>>> dd
defaultdict(<function zero at 0xb7ed2684>, {})
>>> dd['foo']
0
>>> dd
defaultdict(<function zero at 0xb7ed2684>, {'foo': 0})
番外篇:

自己定义defaultdict 类 设置默认返回的参数值

class defaultdict_01(dict):
    def __missing__(self, key):
        self[key] = 'massing'
        return 'massing'

a = defaultdict_01()
print(a['name'])
print(a)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值