Python collections.defaultdict模組用法詳解
Python中通過Key訪問字典,當Key不存在時,會引發‘KeyError'異常。為了避免這種情況的發生,可以使用collections類中的defaultdict()方法來為字典提供預設值。
語法格式:
collections.defaultdict([default_factory[,…]])
class defaultdict(Dict[_KT,_VT],Generic[_KT,_VT]):
default_factory: Callable[[],_VT]
該函式返回一個類似字典的物件。defaultdict是Python內建字典類(dict)的一個子類,它重寫了方法_missing_(key),增加了一個可寫的例項變數default_factory,例項變數default_factory被missing()方法使用,如果該變數存在,則用以初始化構造器,如果沒有,則為None。其它的功能和dict一樣。
第一個引數為default_factory屬性提供初始值,預設為None;其餘引數包括關鍵字引數(keyword arguments)的用法,和dict構造器用法一樣。
1.使用list作第一個引數,可以很容易將鍵-值對序列轉換為列表字典。
from collections import defaultdict s=[('yellow',1),('blue',2),('yellow',3),4),('red',1)] d=defaultdict(list) for k,v in s: d[k].append(v) a=sorted(d.items()) print d print a ''' defaultdict(<type 'list'>,{'blue': [2,4],'red': [1],'yellow': [1,3]}) [('blue',[2,4]),[1]),[1,3])] '''
當字典中沒有的鍵第一次出現時,default_factory自動為其返回一個空列表,list.append()會將值新增進新列表;再次遇到相同的鍵時,list.append()將其它值再新增進該列表。
這種方法比使用dict.setdefault()更為便捷,dict.setdefault()也可以實現相同的功能。
s = [('yellow',1)] d={} for k,v in s: d.setdefault(k,[]).append(v) print d a=sorted(d.items()) print a ''' {'blue': [2,3]} [('blue',3])] '''
2.defaultdict還可以被用來計數,將default_factory設為int即可。
s = 'mississippi' d = defaultdict(int) for k in s: d[k] += 1 print d a=sorted(d.items()) print a ''' defaultdict(<type 'int'>,{'i': 4,'p': 2,'s': 4,'m': 1}) [('i',('m',('p',('s',4)] '''
字串中的字母第一次出現時,字典中沒有該字母,default_factory函式呼叫int()為其提供一個預設值0,加法操作將計算出每個字母出現的次數。
函式int()是常值函式的一種特例,總是返回0。使用匿名函式(lambda function)可以更快、更靈活的建立常值函式,返回包括0在內的任意常數值。
def constant_factory(value): return lambda: value d = defaultdict(constant_factory('<missing>')) print d d.update(name='John',action='ran') print d print '%(name)s %(action)s to %(object)s' % d ''' defaultdict(<function <lambda> at 0x10c180668>,{}) defaultdict(<function <lambda> at 0x10c180668>,{'action': 'ran','name': 'John'}) John ran to <missing> '''
3.default_factory設為set時,可以用defaultdict建立集合字典(a dictionary of sets)
s = [('red',4)] d = defaultdict(set) for k,v in s: d[k].add(v) print d a=sorted(d.items()) print a ''' defaultdict(<type 'set'>,{'blue': set([2,'red': set([1,3])}) [('blue',set([2,4])),set([1,3]))] '''
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。