Python的defaultdict模組和namedtuple模組

發表於2014-12-24

在Python中有一些內建的資料型別,比如int, str, list, tuple, dict等。Python的collections模組在這些內建資料型別的基礎上,提供了幾個額外的資料型別:namedtuple, defaultdict, deque, Counter, OrderedDict等,其中defaultdict和namedtuple是兩個很實用的擴充套件型別。defaultdict繼承自dict,namedtuple繼承自tuple。

一、defaultdict

 1. 簡介

在使用Python原生的資料結構dict的時候,如果用d[key]這樣的方式訪問,當指定的key不存在時,是會丟擲KeyError異常的。但是,如果使用defaultdict,只要你傳入一個預設的工廠方法,那麼請求一個不存在的key時, 便會呼叫這個工廠方法使用其結果來作為這個key的預設值。

defaultdict在使用的時候需要傳一個工廠函式(function_factory),defaultdict(function_factory)會構建一個類似dict的物件,該物件具有預設值,預設值通過呼叫工廠函式生成。

2. 示例

下面給一個defaultdict的使用示例:

對Python比較熟悉的同學可以發現defaultdict(list)的用法和dict.setdefault(key, [])比較類似,上述程式碼使用setdefault實現如下:

3. 原理

從以上的例子中,我們可以基本了defaultdict的用法,下面我們可以通過help(defaultdict)瞭解一下defaultdict的原理。通過Python console列印出的help資訊來看,我們可以發現defaultdict具有預設值主要是通過__missing__方法實現的,如果工廠函式不為None,則通過工廠方法返回預設值,具體如下:

從上面的說明中,我們可以發現一下幾個需要注意的地方:

a). __missing__方法是在呼叫__getitem__方法發現KEY不存在時才呼叫的,所以,defaultdict也只會在使用d[key]或者d.__getitem__(key)的時候才會生成預設值;如果使用d.get(key)是不會返回預設值的,會出現KeyError;

b). defaultdict主要是通過__missing__方法實現,所以,我們也可以通過實現該方法來生成自己的defaultdict,程式碼入下:

4. 版本

defaultdict是在Python 2.5之後才加入的功能,在舊版本的Python中是不支援這個功能的,不過,知道了它的原理,我們可以自己實現一個defaultdict。

二、namedtuple

namedtuple主要用來產生可以使用名稱來訪問元素的資料物件,通常用來增強程式碼的可讀性,在訪問一些tuple型別的資料時尤其好用。其實,在大部分時候你應該使用namedtuple替代tuple,這樣可以讓你的程式碼更容易讀懂,更加pythonic。舉個例子:

在上面的例子中,Student就是一個namedtuple,它和tuple的使用方法一樣,可以通過index直接取,而且是隻讀的。這種方式比tuple容易理解多了,可以很清楚的知道每個值代表的含義。

參考文章:

再談collections模組defaultdict()和namedtuple()

defaultdict 和 dict.__missing__

不可不知的Python模組: collections

Python collections 模組

相關文章