class collections.defaultdict([default_factory[, ...]])
返回一个字典类似的对象。defaultdict是一个内置字典类dict的派生类。它主要是重载了一个方法__missing__(key)和增加一个可修改实例变量,它功能和函数跟dict类是一样的。
第一个参数default_factory是使用它作为默认值的类型,因为python在没有赋值给变量之前是没有办法确认这个变量是属于什么类型的;默认这个值设置为None。其它后面参数与dict类是一样的构造参数。
defaultdict类与dict类的区别是defaultdict类可以设置默认值的类型,而dict类不行,必须先设置键才可以使用值,否则会抛出异常。
defaultdict类增加了下面的方法:
__missing__(key)
如果default_factory属性为None,当访问一个key不存在时会抛出异常 KeyError。
如果default_factory属性不为None,当访问一个key不存在时,就会将此值插入到字典,并使用此类型构造一个值插入到字典的value里。
如果调用default_factory创建值时发生异常,此异常会传递到外面调用的函数。
defaultdict类增加下面可写的实例变量:
default_factory
这个属性在方法__missing__(key)里使用,如果在构造函数里第一个参数有设置,就会保存到这里,如果没有设置就保存为None。
使用list作为默认类型工厂:
#python 3.4
import collections
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
dd = collections.defaultdict(list)
for k, v in s:
dd[k].append(v)
print(list(dd.items()))
结果输出如下:
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
在这个例子里,可以看到每个键在访问时,不是已经创建的,而是调用list来构造一个,然后再把相关内容添加列表list里,即是使用调list.append()函数的功能。
设置defaultdict的工厂类为int类型,就可以用来进行很方便计数,而不需要进行插入字典的动作:
#python 3.4
import collections
s = 'caicaicaicaicaicaicaimouseii'
dd = collections.defaultdict(int)
for k in s:
dd[k] +=1
print(list(dd.items()))
结果输出如下:
[('s', 1), ('a', 7), ('u', 1), ('o', 1), ('i', 9), ('c', 7), ('e', 1), ('m', 1)]
设置为自定义的类型:
#python 3.4
import collections
def constant_factory(value):
return lambda: value
dd = collections.defaultdict(constant_factory('test'))
dd.update(name = 'cai', action = 'learn')
print('%(name)s %(action)s %(object)s' % dd)
结果输出如下:
cai learn test
使用集合字典来归类不同的信息:
#python 3.4
import collections
s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
dd = collections.defaultdict(set)
for k, v in s:
dd[k].add(v)
print(list(dd.items()))
结果输出如下:
[('blue', {2, 4}), ('red', {1, 3})]
蔡军生 QQ:9073204 深圳