在Python里面有一个模块collections,解释是数据类型容器模块。这里面有一个collections.defaultdict()经常被用到。主要说说这个东西。
综述:
这里的defaultdict(function_factory)构建的是一个类似dictionary的对象,其中keys的值,自行确定赋值,但是values的类型,是function_factory的类实例,而且具有默认值。比如default(int)则创建一个类似dictionary对象,里面任何的values都是int的实例,而且就算是一个不存在的key, d[key] 也有一个默认值,这个默认值是int()的默认值0.
defaultdict
dict subclass that calls a factory function to supply missing values。
这是一个简短的解释
defaultdict属于内建函数dict的一个子类,调用工厂函数提供缺失的值。
用法:
标准字典包括一个方法setdefault()来获取一个值,如果这个值不存在则建立一个默认值。与之相反,defaultdict初始化容器时会让调用者提前指定默认值。
import collections def default_factory(): return 'default_value' d=collections.defaultdict(default_factory,foo='bar') print 'd:',d print 'foo=>',d['foo'] print 'bar=>',d['bar']
d: defaultdict(<function default_factory at 0x01BFAB70>, {'foo': 'bar'})
foo=> bar
bar=> default_value
>>> d['key']
'default_value'
>>>
我现在调用d['xx']也会输出default_value
上面的等同于:
d=collections.defaultdict(lambda :'default_value',foo='bar')
只要所有键都有相同的默认值并无不妥,就可以使用这个方法。如果默认值是一种用于聚集或累加值的类型,如list、set或者甚至是int,这个方法尤其有用。标准库文档提供了很多采用这种方式使用defaultdict的例子。
一般用法:
需要使用字典作为跟踪数据的容器时,defaultdict对象很有用。例如跟踪字符串s中每个单词的位置。
>>> from collections import defaultdict
>>> s="ashin chen C ashin chen C ashin chen C"
>>> words = s.split()
>>> wordlocations=defaultdict(list)
>>> for n, w in enumerate(words):
... wordlocations[w].append(n)
...
>>> wordlocations
defaultdict(<type 'list'>, {'ashin': [0, 3, 6], 'chen': [1, 4, 7], 'C': [2, 5, 8]})
>>>
wordlocations[w]在遇到第一个单词时将失败,但是不会抛出异常,而是调用作为default_factory提供的函数list来创建一个新值。
相当于wordlocations.setdefault(w, []).append(n)。但是这个速率会慢两倍。
import collections s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] # defaultdict d = collections.defaultdict(list) for k, v in s: d[k].append(v) # Use dict and setdefault g = {} for k, v in s: g.setdefault(k, []).append(v)
defaultdict和dict就如同上面。
http://kodango.com/defaultdict-in-python
跟多参考:http://www.cnblogs.com/herbert/archive/2013/01/09/2852843.html