最近在学习collections库,做一点笔记。
1、基础介绍
统计一个列表中元素出现的次数
#encoding:utf-8
from collections import defaultdict
users = ["bobby1","bobby2","bobby3","bobby2","bobby4","bobby5","bobby4"]
user_dic = {}
#统计一下每个字段出现的次数
# 方法一
for user in users:
user_dic[user] += 1
很明显因为在取user_dict['bobby1']的时候失败,因为该dict中并无bobby1的key值,因此做以下修改
for user in users:
if user not in user_dic:
user_dic[user] = 1
else:
user_dic[user] += 1
print(user_dic)
使用setdefault函数
for user in users:
# user为键值
user_dic.setdefault(user,0)
user_dic[user] += 1
print(user_dic)
那为什么setdefault有这个功能呢,查看其代码
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
接着对其再进行优化
#encoding:utf-8
from collections import defaultdict
users = ["bobby1","bobby2","bobby3","bobby2","bobby4","bobby5","bobby4"]
default_dic = defaultdict(int)
for user in users:
default_dic[user] += 1
print(default_dic)
因此针对以上特性,从而有对于Python中通过Key访问字典,当Key不存在时,会引发‘KeyError’异常。为了避免这种情况的发生,可以使用collections类中的defaultdict()方法来为字典提供默认值。
defaultdict接受一个工厂函数作为参数,如下来构造:
dict =defaultdict( factory_function)
这个factory_function可以是list、set、str等等,作用是当key不存在时,返回的是工厂函数的默认值,比如list对应[ ],str对应的是空字符串,set对应set( ),int对应0
使用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(a)
2、规避字典中无键值的参数传递
其实我自己用的collections较多的是传递参数时,如果传了该参数则使用参数,如果没有传递参数则使用默认值
from collections import defaultdict
def proposeIBPS101(newDic = {}):
# receiptAccount=收方账户,amount=金额:
tempDic = defaultdict(dict)
tempDic.update(newDic)
newDic = tempDic
values = {
"receiptAccount":"{}".format(62258487410258011 if not newDic["receiptAccount"] else newDic["receiptAccount"]),
"amount":"{}".format(newDic["amount"])
}
print values
if __name__ == '__main__':
# ex1: 只传递一个参数
newDic = {"amount":1.13}
proposeIBPS101(newDic)
# ex2:传递两个参数
newDic = {"receiptAccount":62258487410258022,"amount":1.13}
proposeIBPS101(newDic)
输出结果如下:
{'amount': '1.13', 'receiptAccount': '62258487410258011'}
{'amount': '1.13', 'receiptAccount': '62258487410258022'}
在示例一种只传递了一个参数,因此条件表达式中判断为真,直接将默认参数62258487410258011 赋值给receiptAccount账户;第二个传递了账户,则直接使用传递的账户。
3、一个键多个值的字典
如何实现一个键对应多个值的字典,即是(multidict)?
之所以有这个问题是因为在读取DB2的数据库时,存在一个表对应的报文会登记两条记录,只是每个字段对应的值不同,常用的构造一键多值的形式如下:
dic1 = {
'a':["paymentName","paymentAccount"],
'b':["receiptName","receiptAccount"],
}
dic2 = {
'a': {"paymentName", "paymentAccount"},
'b': {"receiptName", "receiptAccount"},
}
或者很方便的使用collections中的defaultdict来构造这样的字典
tempDic = defaultdict(list)
tempDic['a'].append("paymentName")
tempDic['a'].append("paymentAccount")
print(tempDic)