collections之defaultdict

最近在学习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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值