您的位置:首页 > 其它

5.3.4 defaultdict对象

2016-01-09 21:34 176 查看
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。

5.3.4.1 defaultdict例子

使用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 深圳
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: