1. 程式人生 > 程式設計 >Python collections.defaultdict模組用法詳解

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]))]
'''

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。