天天看點

defaultdict python_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), ('blue', 4), ('red', 1)]

d=defaultdict(list)

for k, v in s:

d[k].append(v)

a=sorted(d.items())

print d

print a

'''

defaultdict(, {'blue': [2, 4], 'red': [1], 'yellow': [1, 3]})

[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

'''

當字典中沒有的鍵第一次出現時,default_factory自動為其傳回一個空清單,list.append()會将值添加進新清單;再次遇到相同的鍵時,list.append()将其它值再添加進該清單。

這種方法比使用dict.setdefault()更為便捷,dict.setdefault()也可以實作相同的功能。

s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]

d={}

for k, v in s:

d.setdefault(k,[]).append(v)

print d

a=sorted(d.items())

print a

'''

{'blue': [2, 4], 'red': [1], 'yellow': [1, 3]}

[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 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(, {'i': 4, 'p': 2, 's': 4, 'm': 1})

[('i', 4), ('m', 1), ('p', 2), ('s', 4)]

'''

字元串中的字母第一次出現時,字典中沒有該字母,default_factory函數調用int()為其提供一個預設值0,加法操作将計算出每個字母出現的次數。

函數int()是常值函數的一種特例,總是傳回0。使用匿名函數(lambda function)可以更快、更靈活的建立常值函數,傳回包括0在内的任意常數值。

def constant_factory(value):

return lambda: value

d = defaultdict(constant_factory(''))

print d

d.update(name='John', action='ran')

print d

print '%(name)s %(action)s to %(object)s' % d

'''

defaultdict( at 0x10c180668>, {})

defaultdict( at 0x10c180668>, {'action': 'ran', 'name': 'John'})

John ran to

'''

3.default_factory設為set時,可以用defaultdict建立集合字典(a dictionary of sets)

s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]

d = defaultdict(set)

for k, v in s:

d[k].add(v)

print d

a=sorted(d.items())

print a

'''

defaultdict(, {'blue': set([2, 4]), 'red': set([1, 3])})

[('blue', set([2, 4])), ('red', set([1, 3]))]

'''

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