defaultdict 返回一个类 dict 的对象,defaultdict 是内置的 dict 类的子类。

如果访问 dict 未初始化的 key 值时,会抛出 KeyError 异常。

1 s_tuple = ('a', 'b', 'a', 'a',
2            'c', 'a', 'b', 'a')
3
4 c_dict = {}
5
6 for s in s_tuple:
7     c_dict[s] += 1
8
9 print(c_dict)

输出如下:

1 Traceback (most recent call last):
2   File "FileNamePath", line 7, in <module>
3     c_dict[s] += 1
4 KeyError: 'a'

对代码进行修正后如下:

 1 s_tuple = ('a', 'b', 'a', 'a',
 2            'c', 'a', 'b', 'a')
 3
 4 c_dict = {}
 5
 6 for s in s_tuple:
 7     if s not in c_dict:
 8         c_dict[s] = 1
 9     else:
10         c_dict[s] += 1
11
12 print(c_dict)

能够正常输出每个 str 出现的统计次数,不过每次循环都要进行判断当前 dict 中是否存在这个 key 值。不过 dict 的 api 中提供了 setdefault() 方法,该方法需提供两个参数,第一个为 key 值,第二个为该 key 初始状态下的默认值。如果字典中不存在此 key 值,则该方法返回默认值,反之返回该 key 值对应的 value。

1 s_tuple = ('a', 'b', 'a', 'a',
2            'c', 'a', 'b', 'a')
3
4 c_dict = {}
5
6 for s in s_tuple:
7     c_dict[s] = c_dict.setdefault(s, 0) + 1
8
9 print(c_dict)

下面引入 defaultdict 的用法,defaultdict 类初始化时接收一个类型作为参数,当访问的 key 值不存在时,可实例化传入的类型参数的实例作为默认值。

1 from collections import defaultdict
2
3 d_defaultdict = defaultdict(list)
4
5 print(d_defaultdict)
6 print(d_defaultdict.__getitem__('1'))
7 print(d_defaultdict)

输出如下:

1 defaultdict(<class 'list'>, {})
2 []
3 defaultdict(<class 'list'>, {'1': []})

由于初始化 defaultdict 时,传入的类型是 list,因此 key 为 '1' 的 value 默认为 [],如果参数为 tuple,那么 value 的默认值为 ()。

需要注意的是,默认值只有通过 defaultdict[key] 或 defaultdict.__getitem__(key) 访问 defaultdict 时才会被初始化。

extend

问题来了 defaultdict 是如何实现为不存在的 key 值初始化默认值的?

阅读 _collections.py 源码中的 class defaultdict(dict) 部分,可以看到一个 def __missing__(self, key) 的实例方法。

源码如下:

1 def __missing__(self, key):  # real signature unknown; restored from __doc__
2     """
3     __missing__(key) # Called by __getitem__ for missing key; pseudo-code:
4       if self.default_factory is None: raise KeyError((key,))
5       self[key] = value = self.default_factory()
6       return value
7     """
8     pass

由此可见,当通过 __getitem__ 方法访问 defaultdict 中的某个不存在的 key 值时,会在抛出的 KeyError 异常中进行处理,根据传入的类型参数返回初始化的 value 值。

那么,这个 __missing__ 方法中的内容可否自己实现呢,不妨试试:

 1 class defaultdict_copy(dict):
 2     def __missing__(self, key):
 3         self[key] = 'default'
 4         return 'default'
 5
 6
 7 d_defaultdict_copy = defaultdict_copy()
 8 print(d_defaultdict_copy)
 9 print(d_defaultdict_copy['1'])
10 print(d_defaultdict_copy)

输出如下:

1 {}
2 default
3 {'1': 'default'}

很明显,对于 dict 的继承类中,存在一个 __missing__ 的实例方法,可以通过重写该方法实现访问不存在的 key 值时进行 value 的初始化。

转载于:https://www.cnblogs.com/ZhangYidada/p/6385634.html

Python系列之Collections内置模块(2)相关推荐

  1. 青少年python系列 33.python安装非内置模块

    青少年python教学视频ppt源码 青少年python系列目录_老程序员115的博客-CSDN博客 简介 python内置模及其内部的功能函数,是无法满足我们编程需求的.这时候如果有能够满足我们需要 ...

  2. 董付国老师6本Python系列图书阅读指南

    大概在2013年底的时候,我开始策划面向不同读者群体的Python系列图书,2015年开始,在清华大学出版社陆续出版了系列图书,目前已全面覆盖中国大陆地区博士.硕士.本科.高职高专教材和各层次自学读者 ...

  3. 青少年python系列目录

    青少年python教学视频ppt源码 青少年ptyhon可以参加的主流比赛大全_老程序员115的博客-CSDN博客 全国青少年软件编程等级考试标准Python(1-6级)_老程序员115的博客-CSD ...

  4. python 找质数的个数_盘一盘 Python 系列特别篇 All 和 Any

    本文含 3758 字,9图表截屏建议阅读 10 分钟 本文是 Python 系列的特别篇的第十四篇 特别篇 1 - PyEcharts TreeMap 特别篇 2 - 面向对象编程 特别篇 3 - 两 ...

  5. df满足条件的值修改_文科生学 Python 系列 16:泰坦尼克数据 2(缺失值处理)

    第八课:案例分析 - 泰坦尼克数据 本节课将重点分析泰坦尼克号沉船事故,我们将探索是什么因素决定了最后是否生还. 我们将将前面课程所学过的知识点融会贯通,举一反三 新增知识点: 缺失值处理:panda ...

  6. 文科生学python系列_文科生学 Python 系列 3:函数

    文科生学Python系列3:函数​www.jianshu.com 还是第二课的内容 函数是一段可以重复使用的代码,往往是为了解决某个特定的人物.在 Python 中有两种函数:内置函数和自定义函数. ...

  7. python布尔测试对象_面试题十九期-测试开发面试题之python系列-这个中~

    坚持梦想 就算所有人都不支持你.这条路会很曲折,你也会一度认为是不是自己选错了,但只要坚持,就算最后没有成功,但努力了就不会有遗憾. 测试开发python系列面试题 01 单选题 1.下列哪个语句在P ...

  8. python内置collections模块的使用

    python内置collections模块的使用 文章目录: 一.collections模块说明 1.查看collections模块的定义路径 2.查看collections文档介绍信息 3.查看co ...

  9. 【直播资料下载】Python 系列直播——深入Python与日志服务,玩转大规模数据分析处理实战第二讲...

    流畅的Python数据处理及大数据处理ETL Python 系列直播--深入Python与日志服务,玩转大规模数据分析处理实战 直播讲师:丁来强(成喆)--阿里高级技术专家,从事阿里云日志服务相关的产 ...

最新文章

  1. rabbitmq几种工作模式_RabbitMQ的六种工作模式总结
  2. 在spring boot中集成Swagger
  3. 史上最难10道Java面试题!
  4. 端口镜像NIDS技术(sniffer抓包)
  5. 使用ganglia监控hadoop
  6. PHP自动压缩CSS文件方法,php 压缩多个CSS文件的实现代码
  7. 微博爬虫 ----- 微博发布时间清洗
  8. 用EasyRecovery怎么恢复电脑中已删除的视频
  9. (L)小写l和(i)大写I的区分方法
  10. netware php_Apache MPM netware
  11. 给div元素设置背景颜色
  12. Android相关问题的好文章整理——温故而知新,可以为师矣
  13. k8s Container资源控制: requests和limits
  14. qt中各种类型转成uchar
  15. eclipse + pydev远程调试OpenStack
  16. C语言 静音检测,ffmpeg静音检测 Autohotkey
  17. Las Vegas Sands Purchase May Tell More About Macau
  18. MySQL 后from多个表_SELECT * FROM多个表。 MySQL的
  19. CityEngine使用GIS模板创建三维数字城市(三)
  20. DDS协议与OPCUA对比

热门文章

  1. linux deepin tar安装jdk8
  2. 解释内存中的栈、堆、静态区
  3. char型变量中能不能存储一个中文汉字?为什么?
  4. Collections工具类常用API使用示例
  5. python读取文本并且替换_lin如何读取和替换python行文件中的文本
  6. SQL 新加字段查询窗口报错
  7. python多线程并发编程技术_同步线程 - Python并发编程教程™
  8. 一幅图看懂Python编程
  9. ifconfig 命令找不到解决
  10. 28 March 2019