构造函数= default;_Python Collections之defaultdict 和 default_factory关系
容器(collections)是Python附帶一個模塊,它包含許多容器數(shù)據(jù)類型,今天先拿出defaultdict來說。
dict在python中是非常常見的一種數(shù)據(jù)類型。
colours = (('Yasoob', 'Yellow'),('Ali', 'Blue'),('Arham', 'Green'), ) dict = {} for name, colour in colours:dict[name] = colour print(dict) #output: {'Yasoob': 'Yellow', 'Ali': 'Blue', 'Arham': 'Green'}以上是dict的最常見用法,構(gòu)造 鍵-值,但是它的缺陷是碰到?jīng)]有遇到的鍵,就會報錯
print(dict['bob']) #output:KeyError: 'bob'這時候defaultdict就能派上用場了。
classcollections.defaultdict([default_factory[,...]])
defaultdict 是內(nèi)置 dict 類的子類。它重載了一個方法并添加了一個可寫的實例變量。其余的功能與 dict 類相同。
本對象包含一個名為 default_factory 的屬性,構(gòu)造時,第一個參數(shù)用于為該屬性提供初始值,默認為 None。所有其他參數(shù)(包括關鍵字參數(shù))都相當于傳遞給 dict 的構(gòu)造函數(shù)。
根據(jù)定義,defaultdic只是比dict多了一個方法,而這個方法就是__missing__, 這個方法與default_factory有關。
如果 default_factory 屬性為 None,則調(diào)用本方法會拋出 KeyError 異常,附帶參數(shù) key。如果 default_factory 不為 None,則它會被(不帶參數(shù)地)調(diào)用來為 key 提供一個默認值,這個值和 key 作為一對鍵值對被插入到字典中,并作為本方法的返回值返回。default_factory
本屬性由__missing__()方法來調(diào)用。如果構(gòu)造對象時提供了第一個參數(shù),則本屬性會被初始化成那個參數(shù),如果未提供第一個參數(shù),則本屬性為None。default_factory可以為很多類型,list、set、str都可以,如果key不存在,返回為默認值。
dict1 = defaultdict(int) dict2 = defaultdict(set) dict3 = defaultdict(str) dict4 = defaultdict(list)print(dict1[1]) print(dict2[1]) print(dict3[1]) print(dict4[1])output: 0 int的默認值 set() set的默認值str的默認值 [] list的默認值List
使用 list 作為 default_factory,很輕松地將(鍵-值對組成的)序列轉(zhuǎn)換為(鍵-列表組成的)字典:
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] d = defaultdict(list) for k, v in s:d[k].append(v) print(d)output: defaultdict(<class 'list'>, {'yellow': [1, 3], 'blue': [2, 4], 'red': [1]})Int
設置 default_factory 為 int,使 defaultdict 用于計數(shù)(類似其他語言中的 bag 或 multiset):
str = 'chinese' d = defaultdict(int) for k in str:d[k] += 1 print(d)output: defaultdict(<class 'int'>, {'c': 1, 'h': 1, 'i': 1, 'n': 1, 'e': 2, 's': 1})當一個字母首次遇到時,它會查詢失敗,則 default_factory 會調(diào)用 int() 來提供一個整數(shù) 0 作為默認值。后續(xù)的自增操作建立起對每個字母的計數(shù)。
Set
設置 default_factory 為 set 使 defaultdict 用于構(gòu)建 set 集合:
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)output: defaultdict(<class 'set'>, {'red': {1, 3}, 'blue': {2, 4}})Lambda
Lambda函數(shù)更為靈活的指定默認值,可以為任意值。
strings = 'chinese' counts = defaultdict(lambda: 0) for i in strings:counts[i] +=1 print(counts)output: defaultdict(<function <lambda> at 0x7fe1b1b3d170>, {'c': 1, 'h': 1, 'i': 1, 'n': 1, 'e': 2, 's': 1})#和int一樣的效果test = defaultdict(lambda : 'hello') test[1] test[2] = 'two' print(test)output: defaultdict(<function <lambda> at 0x7fe338b11170>, {1: 'hello', 2: 'two'})Tips:
之前的輸出都是連帶著defaultdict里default_factory都輸出了,但是一般沒有必要,只需要使用item。
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) print(d.items())output: defaultdict(<class 'set'>, {'red': {1, 3}, 'blue': {2, 4}}) dict_items([('red', {1, 3}), ('blue', {2, 4})])平凡:Python collections 之 Counter?zhuanlan.zhihu.com平凡:Python Collections 之 deque?zhuanlan.zhihu.com
總結(jié)
以上是生活随笔為你收集整理的构造函数= default;_Python Collections之defaultdict 和 default_factory关系的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dnf追加按键是什么(地下城与勇士)
- 下一篇: python中s和t是两个集合、对s|t