前言
今天我們的主角是 defaultdict ,同時也會介紹一下模仿方法 __missing__() ,本文主要來源于網友博客,分享給有需要的人。下面話不多說了,來一起看看詳細的介紹吧。
默認值可以很方便
眾所周知,在Python中如果訪問字典中不存在的鍵,會引發KeyError異常。但是有時候,字典中的每個鍵都存在默認值是非常方便的。例如下面的例子:
strings = ('puppy', 'kitten', 'puppy', 'puppy', 'weasel', 'puppy', 'kitten', 'puppy')counts = {}for kw in strings: counts[kw] += 1該例子統計strings中某個單詞出現的次數,并在counts字典中作記錄。單詞每出現一次,在counts相對應的鍵所存的值數字加1。但是事實上,運行這段代碼會拋出KeyError異常,出現的時機是每個單詞第一次統計的時候,因為Python的dict中不存在默認值的說法,可以在Python命令行中驗證:
>>> counts = dict()>>> counts{}>>> counts['puppy'] += 1Traceback (most recent call last): File "<stdin>", line 1, in <module>KeyError: 'puppy'使用判斷語句檢查
既然如此,首先可能想到的方法是在單詞第一次統計的時候,在counts中相應的鍵存下默認值1。這需要在處理的時候添加一個判斷語句:
strings = ('puppy', 'kitten', 'puppy', 'puppy', 'weasel', 'puppy', 'kitten', 'puppy')counts = {}for kw in strings: if kw not in counts: counts[kw] = 1 else: counts[kw] += 1# counts:# {'puppy': 5, 'weasel': 1, 'kitten': 2}使用 dict.setdefault() 方法
也可以通過 dict.setdefault() 方法來設置默認值:
strings = ('puppy', 'kitten', 'puppy', 'puppy', 'weasel', 'puppy', 'kitten', 'puppy')counts = {}for kw in strings: counts.setdefault(kw, 0) counts[kw] += 1dict.setdefault() 方法接收兩個參數,第一個參數是健的名稱,第二個參數是默認值。假如字典中不存在給定的鍵,則返回參數中提供的默認值;反之,則返回字典中保存的值。利用 dict.setdefault() 方法的返回值可以重寫for循環中的代碼,使其更加簡潔:
strings = ('puppy', 'kitten', 'puppy', 'puppy', 'weasel', 'puppy', 'kitten', 'puppy')counts = {}for kw in strings: counts[kw] = counts.setdefault(kw, 0) + 1使用 collections.defaultdict 類
以上的方法雖然在一定程度上解決了dict中不存在默認值的問題,但是這時候我們會想,有沒有一種字典它本身提供了默認值的功能呢?答案是肯定的,那就是 collections.defaultdict 。
defaultdict類就好像是一個dict,但是它是使用一個類型來初始化的:
>>> from collections import defaultdict>>> dd = defaultdict(list)>>> dddefaultdict(<type 'list'>, {})
新聞熱點
疑難解答