Python collections模块详解之——defaultdict
基本信息
collections-Container datatype
collections模块实现了一些特殊的容器类型,用作Python内置的通用容器dict,list,set和tuple的补充.本次介绍其中的defaultdict模块.它是dict的子类,使用一个工厂函数来为字典提供默认值.
其定义方式如下:
class collections.defaultdict([default_factory[, ...]])
它返回一个字典对象.
第一个输入参数是default_factory,默认值为None.也可以是一个返回某个具体值的函数,包括lambda表达式.
使用简介
使用list作为工厂函数
from collections import defaultdict
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
for k, v in s:
d[k].append(v)
d.items()
dict_items([('yellow', [1, 3]), ('blue', [2, 4]), ('red', [1])])
如果我们不使用defaultdict而使用普通的dict,则不能直接写d[k].append(v)
.因为如果k
没有包含在字典d
中是会报错的.我们必须像下面这样写:
d = {}
for k, v in s:
d.setdefault(k, []).append(v)
d.items()
dict_items([('yellow', [1, 3]), ('blue', [2, 4]), ('red', [1])])
显然使用defaultdict更加简洁方便
使用int作为工厂函数
s = 'mississippi'
d = defaultdict(int)
for k in s:
d[k] += 1
d.items()
dict_items([('m', 1), ('i', 4), ('s', 4), ('p', 2)])
如果我们要使用普通的dict实现这个代码,必须得调用setdefault
函数.显然没有这么简洁,方便.
自定义工厂函数
官方文档中提示更加高效灵活的设置工厂函数的方式是使用lambda表达式提供任何形式的常值.工厂函数可以这样定义:
def my_df(value):
return lambda: value
使用方式如下:
d = defaultdict(my_df(-1))
d.update(a=1, b=2)
print(d.items())
print(d['c'])
dict_items([('a', 1), ('b', 2)])
-1