collections之defaultdict
最近在學(xué)習(xí)collections庫,做一點(diǎn)筆記。
1、基礎(chǔ)介紹
統(tǒng)計(jì)一個(gè)列表中元素出現(xiàn)的次數(shù)
#encoding:utf-8from collections import defaultdictusers = ["bobby1","bobby2","bobby3","bobby2","bobby4","bobby5","bobby4"] user_dic = {} #統(tǒng)計(jì)一下每個(gè)字段出現(xiàn)的次數(shù) # 方法一 for user in users:user_dic[user] += 1很明顯因?yàn)樵谌ser_dict['bobby1']的時(shí)候失敗,因?yàn)樵揹ict中并無bobby1的key值,因此做以下修改
for user in users:if user not in user_dic:user_dic[user] = 1else:user_dic[user] += 1print(user_dic)使用setdefault函數(shù)
for user in users:# user為鍵值user_dic.setdefault(user,0)user_dic[user] += 1print(user_dic)那為什么setdefault有這個(gè)功能呢,查看其代碼
def setdefault(self, *args, **kwargs): # real signature unknown"""Insert key with a value of default if key is not in the dictionary.Return the value for key if key is in the dictionary, else default."""pass即是如果key不在字典中,則插入key值;如果key在字典中,則返回key的值,否則返回default
接著對(duì)其再進(jìn)行優(yōu)化
#encoding:utf-8from collections import defaultdictusers = ["bobby1","bobby2","bobby3","bobby2","bobby4","bobby5","bobby4"]default_dic = defaultdict(int) for user in users:default_dic[user] += 1print(default_dic)因此針對(duì)以上特性,從而有對(duì)于Python中通過Key訪問字典,當(dāng)Key不存在時(shí),會(huì)引發(fā)‘KeyError’異常。為了避免這種情況的發(fā)生,可以使用collections類中的defaultdict()方法來為字典提供默認(rèn)值。
defaultdict接受一個(gè)工廠函數(shù)作為參數(shù),如下來構(gòu)造:
dict =defaultdict( factory_function)這個(gè)factory_function可以是list、set、str等等,作用是當(dāng)key不存在時(shí),返回的是工廠函數(shù)的默認(rèn)值,比如list對(duì)應(yīng)[ ],str對(duì)應(yīng)的是空字符串,set對(duì)應(yīng)set( ),int對(duì)應(yīng)0
使用list作第一個(gè)參數(shù),可以很容易將鍵-值對(duì)序列轉(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(a)2、規(guī)避字典中無鍵值的參數(shù)傳遞
其實(shí)我自己用的collections較多的是傳遞參數(shù)時(shí),如果傳了該參數(shù)則使用參數(shù),如果沒有傳遞參數(shù)則使用默認(rèn)值
from collections import defaultdictdef proposeIBPS101(newDic = {}):# receiptAccount=收方賬戶,amount=金額:tempDic = defaultdict(dict)tempDic.update(newDic)newDic = tempDicvalues = {"receiptAccount":"{}".format(62258487410258011 if not newDic["receiptAccount"] else newDic["receiptAccount"]),"amount":"{}".format(newDic["amount"])}print valuesif __name__ == '__main__':# ex1: 只傳遞一個(gè)參數(shù)newDic = {"amount":1.13}proposeIBPS101(newDic)# ex2:傳遞兩個(gè)參數(shù)newDic = {"receiptAccount":62258487410258022,"amount":1.13}proposeIBPS101(newDic)輸出結(jié)果如下:
{'amount': '1.13', 'receiptAccount': '62258487410258011'} {'amount': '1.13', 'receiptAccount': '62258487410258022'}在示例一種只傳遞了一個(gè)參數(shù),因此條件表達(dá)式中判斷為真,直接將默認(rèn)參數(shù)62258487410258011 賦值給receiptAccount賬戶;第二個(gè)傳遞了賬戶,則直接使用傳遞的賬戶。
3、一個(gè)鍵多個(gè)值的字典
如何實(shí)現(xiàn)一個(gè)鍵對(duì)應(yīng)多個(gè)值的字典,即是(multidict)?
之所以有這個(gè)問題是因?yàn)樵谧x取DB2的數(shù)據(jù)庫時(shí),存在一個(gè)表對(duì)應(yīng)的報(bào)文會(huì)登記兩條記錄,只是每個(gè)字段對(duì)應(yīng)的值不同,常用的構(gòu)造一鍵多值的形式如下:
dic1 = {'a':["paymentName","paymentAccount"],'b':["receiptName","receiptAccount"],}dic2 = {'a': {"paymentName", "paymentAccount"},'b': {"receiptName", "receiptAccount"},}或者很方便的使用collections中的defaultdict來構(gòu)造這樣的字典
tempDic = defaultdict(list)tempDic['a'].append("paymentName")tempDic['a'].append("paymentAccount")print(tempDic)?
總結(jié)
以上是生活随笔為你收集整理的collections之defaultdict的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javaScript字符串应用
- 下一篇: python中使用ElementTree