5.3.4 defaultdict对象

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  深圳

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值