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)