二十九、深入Python中的collections模块( 二 )

defaultdict在使用字典的时候, 如果在使用不存在的key的时候发生KeyError这样的一个报错, 这时候就该defaultdict登场了 。
defaultdict接受一个工厂函数作为参数来构造:dict =defaultdict( factory_function)
这个factory_function可以是list、set、str等等 , 作用是当key不存在时 , 返回的是工厂函数的默认值 , 比如list对应[ ] , str对应的是空字符串 , set对应set( ) , int对应0 , 如下举例:
from collections import defaultdictdict1 = defaultdict(int)dict2 = defaultdict(set)dict3 = defaultdict(str)dict4 = defaultdict(list)dict1[2] ='two'print(dict1[1])print(dict2[1])print(dict3[1])print(dict4[1])# 输出如下0set()[]defaultdict类接受类型名称作为初始化函数的参数 , 这样使得默认值的取值更加灵活 。
s = 'mynameisrunsen'd = collections.defaultdict(int)for k in s:d[k] += 1print(d)# 输出如下defaultdict(, {'m': 2, 'y': 1, 'n': 3, 'a': 1, 'e': 2, 'i': 1, 's': 2, 'r': 1, 'u': 1})练习有如下值集合 [11,22,33,44,55,66,77,88,99,99] 。
下面将所有大于 55的值保存至字典的第一个key中 , 将小于 55 的值保存至第二个key的值中 。
下面通过defaultdict默认字典对列表进行划分 。
all_list = [11,22,33,44,55,66,77,88,99]dic = collections.defaultdict(list)for i in all_list:if i > 55:dic['k1'].append(i)else:dic['k2'].append(i)print(dic)# 输出如下defaultdict(, {'k2': [11, 22, 33, 44, 55], 'k1': [66, 77, 88, 99]})也可以使用字典 , 具体代码如下 。
all_list = [11,22,33,44,55,66,77,88,99]dic = {}for i in all_list:if i > 55:if "k1" in dic.keys():dic['k1'].append(i)else:dic['k1'] = [i,]else:if "k2" in dic.keys():dic['k2'].append(i)else:dic['k2'] = [i,]print(dic)# 输出如下{'k2': [11, 22, 33, 44, 55], 'k1': [66, 77, 88, 99]}namedtuplenamedtuple是用来创建一个自定义的tuple对象 , 并且规定了tuple元素的个数 , 并可以用属性而不是索引来引用tuple的某个元素 。
使用命名元组的步骤:
# 将元组封装为一个类 , 可以通过字段名(属性名)来访问元组中的值# 支持元组的所有操作from collections import namedtuple# 1、定义一个类Runsen = namedtuple('Runsen', ['name','sex','age'])# 2、创建对象runsen = Runsen("Runsen", "帅男", 21)# 3、获取命名元组的值print(runsen[1])# 支持元组的索引取值print(runsen[-2:])# 支持切片print(runsen.name)# 支持通过字段名来取值 # _fields , 获取命名元组的所有属性名print(runsen._fields)# _asdict方法 , 将元组转化为字典print(runsen._asdict())# 输出如下帅男('帅男', 21)Runsen('name', 'sex', 'age')OrderedDict([('name', 'Runsen'), ('sex', '帅男'), ('age', 21)])?
本文已收录 GitHub , 传送门~[1], 里面更有大厂面试完整考点 , 欢迎 Star 。
?
Reference[1]
传送门~: