Python collections.defaultdict模塊用法詳解
Python中通過Key訪問字典,當Key不存在時,會引發(fā)‘KeyError'異常。為了避免這種情況的發(fā)生,可以使用collections類中的defaultdict()方法來為字典提供默認值。
語法格式:
collections.defaultdict([default_factory[, …]])
class defaultdict(Dict[_KT, _VT], Generic[_KT, _VT]):
default_factory: Callable[[], _VT]
該函數(shù)返回一個類似字典的對象。defaultdict是Python內(nèi)建字典類(dict)的一個子類,它重寫了方法_missing_(key),增加了一個可寫的實例變量default_factory,實例變量default_factory被missing()方法使用,如果該變量存在,則用以初始化構(gòu)造器,如果沒有,則為None。其它的功能和dict一樣。
第一個參數(shù)為default_factory屬性提供初始值,默認為None;其余參數(shù)包括關(guān)鍵字參數(shù)(keyword arguments)的用法,和dict構(gòu)造器用法一樣。
1.使用list作第一個參數(shù),可以很容易將鍵-值對序列轉(zhuǎn)換為列表字典。
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(<type 'list'>, {'blue': [2, 4], 'red': [1], 'yellow': [1, 3]})
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
'''
當字典中沒有的鍵第一次出現(xiàn)時,default_factory自動為其返回一個空列表,list.append()會將值添加進新列表;再次遇到相同的鍵時,list.append()將其它值再添加進該列表。
這種方法比使用dict.setdefault()更為便捷,dict.setdefault()也可以實現(xiàn)相同的功能。
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還可以被用來計數(shù),將default_factory設(shè)為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', 4), ('m', 1), ('p', 2), ('s', 4)]
'''
字符串中的字母第一次出現(xiàn)時,字典中沒有該字母,default_factory函數(shù)調(diào)用int()為其提供一個默認值0,加法操作將計算出每個字母出現(xiàn)的次數(shù)。
函數(shù)int()是常值函數(shù)的一種特例,總是返回0。使用匿名函數(shù)(lambda function)可以更快、更靈活的創(chuàng)建常值函數(shù),返回包括0在內(nèi)的任意常數(shù)值。
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設(shè)為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(<type 'set'>, {'blue': set([2, 4]), 'red': set([1, 3])})
[('blue', set([2, 4])), ('red', set([1, 3]))]
'''
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python解析發(fā)往本機的數(shù)據(jù)包示例 (解析數(shù)據(jù)包)
這篇文章主要介紹了使用python解析獲取發(fā)往本機的數(shù)據(jù)包,并打印出來, 大家參考使用吧2014-01-01
使用Python向DataFrame中指定位置添加一列或多列的方法
今天小編就為大家分享一篇使用Python向DataFrame中指定位置添加一列或多列的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01
python?flappy?bird小游戲分步實現(xiàn)流程
哈嘍,哈嘍~今天小編又來分享小游戲了——flappy?bird(飛揚的小鳥),這個游戲非常的經(jīng)典,游戲中玩家必須控制一只小鳥,跨越由各種不同長度水管所組成的障礙2022-02-02

