在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就如同上面。