collection.defaultdict()函数使用

defaultdict对象

class collection.defaultdict([default_factory[, …]])
返回一个新的类似于字典的对象。

为什么要使用defaultdict对象,而不直接使用dict或者{}

一般创建一个新的字典时,直接有 dict_={}dict_=dict()
添加键值时有 dict_[key]=value
使用字典时有 dict_[key]
但是当欲访问的键值 key 不在字典中时,会报错 KeyError。在访问字典时可以先用判断语句判断 key 是否在字典中:if key in dict_.keys()
另外就是使用 defaultdict 来创建字典,在使用字典的时候就不用判断键值是否在字典中,若不在,则字典会返回一个默认值,而不会报错。

如何使用defaultdict对象

引入defaultdict: from collection import defaultdict
调用defaultdict: dict = defaultdict([default_factory[, …]])
此处的default_factory可以是list, str, int, set等。当default_factory==None时,与dict()相同;当!=None时,会被调用来为key产生一个默认值,将key与默认值作为一对键值插入到字典中,并返回。下边举几个例子。

default_factory为None

此时方法等同于dict(), 当访问的键值不存在时,会抛出keyError的异常,同时附带key值。

s = 'abc'
dict_none = defaultdict()
for k in s:
	dict_none[k] += 1
dict_none['d']
# out: KeyError ... KeyError:'d'
default_factory为int

当第一次遇到键值时,会查询失败,同时调用int()来提供整数0作为键值的默认值,然后继续执行对该键值的相应操作(比如下例中的自加操作)。访问字典时,若key不在字典中,返回默认值0

s = 'mississippi'
dict_int = defaultdict(int)
for k in s:
    dict_int[k] += 1
print(dict_int)
# out: defaultdict(<class 'int'>, {'m': 1, 'i': 4, 's': 4, 'p': 2})

int()返回0是常数函数最常用的形式,还可以使用lambda来实现返回其他初始值。

s = 'abcc'
def my_factory(value):
    return lambda : value
dict_int = defaultdict(my_factory(10))
for k in s:
    dict_int[k] += 1
print(dict_int)
# defaultdict(<function my_factory.<locals>.<lambda> at 0x000002BA750B2820>, {'a': 11, 'b': 11, 'c': 12})
default_factory为list

此时可以将序列(键-值对)转换为字典(键-列表)。访问字典时,若key不在字典中,会返回一个默认值空列表[].

s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
dict_list = defaultdict(list)
for k, v in s:
    dict_list[k].append(v) # append()是list添加元素的方法
    # 也可以使用 dict_list[k] = v; 但此时键值k只对应最后一次赋值v,不是列表组成。
print(dict_list)
# out: defaultdict(<class 'list'>, {'yellow': [1, 3], 'blue': [2, 4], 'red': [1]})
default_factory为set

返回的默认值为set()。

s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
dict_set = defaultdict(set)
for k, v in s:
    dict_set[k].add(v) # add()为set添加元素的方法
print(dict_set)
# out: defaultdict(<class 'set'>, {'red': {1, 3}, 'blue': {2, 4}})
有错立改

记录一些平时接触到的新知识,如有错误的地方,欢迎大家评论指出。勿喷,谢谢。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值