前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用 defaultdict 来简化 dict 的初始化

使用 defaultdict 来简化 dict 的初始化

作者头像
王云峰
发布2023-10-23 10:29:51
1500
发布2023-10-23 10:29:51
举报
文章被收录于专栏:Yunfeng's Simple Blog

1. 概述

在我们使用Python中的dict时,常常需要判断某个关键字是否已经在dict中,如果不存在则创建,非空则进行另外的操作。例如统计一篇文章中所有单词出现次数的代码,大致写法如下:

代码语言:javascript
复制
words_num = {}

for word in words:
    if word not in words_num.keys():
        words_num[word] = 1
    else:
        words_num[word] += 1

这样写总是需要判断key是否在dict中,不是很优雅。

Python标准库collections中defaultdict类可以很好的解决这个问题。这个类使用与dict几乎一样,除了可以在初始化时设置key的默认类型和数值。类的声明格式为defaultdict(default_factory=None, /[, ...])default_factory是一个callable的变量。

别的使用与dict无异,正常使用即可。

例如,foo = defaultdict(int)表示foo中的key的默认类型是int,且默认值为int的默认值0,我们可以获取任意的key,不需要手动初始化key:

代码语言:javascript
复制
>>> from collections import defaultdict
>>> foo = defaultdict(int)
>>> foo['a']
0
>>> foo['b']
0
>>> foo['whatever']
0
>>> foo['a'] += 1
>>> foo['a']
1

所以最开始的例子可以简化为如下:

代码语言:javascript
复制
from collections import defaultdict


words_num = defaultdict(int)

for word in words:
    words_num[word] += 1

可以看到使用defaultdict后,代码中只需要关注上层逻辑(统计单词的出现次数),而不需要关注具体的语法的代码实现(dict是否存在某个key,没有的话xxx,有的话xxx),因此世界变得更美好了一些。

除了int外,用list,tuple,dict,set等作为变量也比较常见。除了内置类型外,还可以自定义函数,比如设置key的默认值为'China':

代码语言:javascript
复制
>>> from collections import defaultdict
>>> def set_default_contry():
...     return "China"
...
>>> person_from = defaultdict(set_default_contry)
>>> person_from['张三']
'China'
>>> person_from['李四']
'China'
>>> person_from['Tim'] = 'USA'
>>> person_from
defaultdict(<function set_default_contry at 0x10896eca0>, {'a': 'China', '张三': 'China', '李四': 'China', 'Tim': 'USA'})

defauldict是一个简单但很好用的功能,在日常的使用中还是能减少一些代码复杂度的。希望这篇小文能给让你写代码更容易,更开心。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 概述
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档