Python—defalutdict类

Python—defalutdict类

简介

class collections.defaultdict([default_factory[, …]])
返回一个类字典的对象。default是dict类的子类。它重载了一个方法,然后添加了一个可写的实例变量。其余功能与dict类相同,这里没有文档说明。

第一个参数提供default_factory属性的初值;默认为None。所有剩余的参数都被视为传递给dict构造函数的参数,包括关键字参数。

defaultdict对象除了支持标准的dict操作外,还支持以下方法:
missing(key):
如果default_factory属性为None,这将引发一个KeyError异常,其中key作为参数.

如果default_factory不是None,则在没有参数的情况下调用它,为给定的键提供默认值,该值将插入键的字典并返回。

如果调用default_factory引发异常,则该异常将不加更改地传播。

当没有找到所请求的键时,dict类的_getitem__()方法调用此方法;它返回或引发的任何内容都将由_getitem__()返回或引发。

注意,除了……getitem__()之外,不需要对任何操作调用……missing__()。这意味着get()将像普通字典一样,返回None作为默认值,而不是使用default_factory。

default_factory
这个属性由_missing__()方法使用;如果存在,则从第一个参数初始化到构造函数;如果不存在,则初始化到None。

我的理解

主要这个东西,就是在字典中缺省key值的时候,自动构造一个默认的值和类型,这个构造通过一个引入的工厂函数来解决。

例子

例如将list中的键—值对添加到字典列表中:

>>> 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()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

当第一次遇到每个键时,它还不在映射中;因此,使用default_factory函数自动创建一个条目,该函数返回一个空列表。然后,list.append()操作将该值附加到新列表。当再次遇到键时,查找将正常进行(为该键返回列表),list.append()操作将向列表添加另一个值。这种技术比使用dict.setdefault()的等价技术更简单、更快:

注意:在默认的dict中使用
dict.setdefault(key, default=None)
参数:

  • key 查找的键值
  • default 当查找的键值不存在使用该默认键值。
    例子:
dict = {'runoob': '菜鸟教程', 'google': 'Google 搜索'}
print "Value : %s" %  dict.setdefault('runoob', None)
print "Value : %s" %  dict.setdefault('Taobao', '淘宝')

所以之前的等价代码为:

>>> d = {}
>>> for k, v in s:
...     d.setdefault(k, []).append(v)
...
>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

Setting the default_factory to int makes the defaultdict useful for counting (like a bag or multiset in other languages):

>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> for k in s:
...     d[k] += 1
...
>>> d.items()
[('i', 4), ('p', 2), ('s', 4), ('m', 1)]

当第一次遇到一个字母时,它在映射中丢失了,因此default_factory函数调用int()来提供一个默认的零计数。然后增量操作为每个字母构建计数。
函数int()总是返回零,它只是常量函数的一种特殊情况。创建常量函数的一个更快、更灵活的方法是使用itertools.repeat(),它可以提供任何常量值(而不仅仅是0):

>>> def constant_factory(value):
...     return itertools.repeat(value).next
>>> d = defaultdict(constant_factory('<missing>'))
>>> d.update(name='John', action='ran')
>>> '%(name)s %(action)s to %(object)s' % d
'John ran to <missing>'

将default_factory设置为set使得defaultdict对于构建集合字典非常有用:

>>> s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
>>> d = defaultdict(set)
>>> for k, v in s:
...     d[k].add(v)
...
>>> d.items()
[('blue', set([2, 4])), ('red', set([1, 3]))]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值