天天看點

python defaultdict 類型

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