Python系列之Collections内置模块(2)
defaultdict 返回一个类 dict 的对象,defaultdict 是内置的 dict 类的子类。
如果访问 dict 未初始化的 key 值时,会抛出 KeyError 异常。
s_tuple = ('a', 'b', 'a', 'a',
'c', 'a', 'b', 'a')
c_dict = {}
for s in s_tuple:
c_dict[s] +=
print(c_dict)
输出如下:
Traceback (most recent call last):
File "FileNamePath", line , in <module>
c_dict[s] +=
KeyError: 'a'
对代码进行修正后如下:
s_tuple = ('a', 'b', 'a', 'a',
'c', 'a', 'b', 'a')
c_dict = {}
for s in s_tuple:
if s not in c_dict:
c_dict[s] =
else:
c_dict[s] +=
print(c_dict)
能够正常输出每个 str 出现的统计次数,不过每次循环都要进行判断当前 dict 中是否存在这个 key 值。不过 dict 的 api 中提供了 setdefault() 方法,该方法需提供两个参数,第一个为 key 值,第二个为该 key 初始状态下的默认值。如果字典中不存在此 key 值,则该方法返回默认值,反之返回该 key 值对应的 value。
s_tuple = ('a', 'b', 'a', 'a',
'c', 'a', 'b', 'a')
c_dict = {}
for s in s_tuple:
c_dict[s] = c_dict.setdefault(s, ) +
print(c_dict)
下面引入 defaultdict 的用法,defaultdict 类初始化时接收一个类型作为参数,当访问的 key 值不存在时,可实例化传入的类型参数的实例作为默认值。
from collections import defaultdict d_defaultdict = defaultdict(list) print(d_defaultdict)
print(d_defaultdict.__getitem__(''))
print(d_defaultdict)
输出如下:
defaultdict(<class 'list'>, {})
[]
defaultdict(<class 'list'>, {'': []})
由于初始化 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) 的实例方法。
源码如下:
def __missing__(self, key): # real signature unknown; restored from __doc__
"""
__missing__(key) # Called by __getitem__ for missing key; pseudo-code:
if self.default_factory is None: raise KeyError((key,))
self[key] = value = self.default_factory()
return value
"""
pass
由此可见,当通过 __getitem__ 方法访问 defaultdict 中的某个不存在的 key 值时,会在抛出的 KeyError 异常中进行处理,根据传入的类型参数返回初始化的 value 值。
那么,这个 __missing__ 方法中的内容可否自己实现呢,不妨试试:
class defaultdict_copy(dict):
def __missing__(self, key):
self[key] = 'default'
return 'default' d_defaultdict_copy = defaultdict_copy()
print(d_defaultdict_copy)
print(d_defaultdict_copy[''])
print(d_defaultdict_copy)
输出如下:
{}
default
{'': 'default'}
很明显,对于 dict 的继承类中,存在一个 __missing__ 的实例方法,可以通过重写该方法实现访问不存在的 key 值时进行 value 的初始化。
Python系列之Collections内置模块(2)的更多相关文章
- Python系列之Collections内置模块(1)
collections 是 python 的内置模块,源码位于 Lib/collections/__init__.py ,该模块提供了通用的数据容器. deque 容器对象 通过 from colle ...
- Python系列之heapq内置模块
heapq 是 python 的内置模块,源码位于 Lib/heapq.py ,该模块提供了基于堆的优先排序算法. 堆的逻辑结构就是完全二叉树,并且二叉树中父节点的值小于等于该节点的所有子节点的值.这 ...
- python中的collections
python中有大量的内置模块,很多是属于特定开发的功能性模块,但collections是属于对基础数据的类型的补充模块,因此,在日常代码中使用频率更高一些,值得做个笔记,本文只做主要关键字介绍,详细 ...
- 总结整理 -- python系列
python系列 python--基础学习(一)开发环境搭建,体验HelloWorld python--基础学习(二)判断 .循环.定义函数.继承.调用 python--基础学习(三)字符串单引号.双 ...
- python模块介绍- collections(5)-OrderedDict 有序字典
1.3.5 OrderedDict 有序字典 OrderedDict是dict的子类,它记住了内容添加的顺序. import collections print 'Regular dictionary ...
- 初探接口测试框架--python系列7
点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...
- 初探接口测试框架--python系列2
点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...
- 初探接口测试框架--python系列3
点击标题下「微信」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是我们期 ...
- 初探接口测试框架--python系列4
点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...
随机推荐
- find命令--xargs--exec
find命令 1.1.find命令选项-name 按照文件名查找-perm 按照文件权限来查找-prune 可以使用find命令排除当前文件夹,不查找-user 可以按照文件属主来查找-group 可 ...
- 函数之DisString
DocStringsPython有一个很奇妙的特性,称为 文档字符串 ,它通常被简称为 docstrings .DocStrings是一个重要的工具,由于它帮助你的程序文档更加简单易懂,你应该尽量使用 ...
- Jquery使用常见(全)
一.选择器实例 语法 描述 $(this) 当前 HTML 元素 $("p") 所有 <p> 元素 $("p.intro") 所有 class=&q ...
- 布隆过滤器(BoomFilter)
1.原理: a.解决的问题: 判断一个元素是否在一个集合中 b.Hash表的特点: i.快速准确 ...
- java类固定值代替基表写法
package cn.com.mcd.enumeration; public enum AuditStatusEnum { NOTAUDIT("0", "未审核" ...
- axis2开发实例(一)
主要参考<axis2之webservice新手超详细教程http://wenku.baidu.com/view/6eae036d011ca300a6c390a4.html> <axi ...
- C socket post数据到url
#define HOST_SERVER_IP "192.168.1.15" #define HOST_PORT 80 int gsh_post_clients(const char ...
- IOS FMDB模糊查询
http://blog.sina.com.cn/s/blog_9630f1310101fx1d.html /查询记录 -(NSArray*)selectitemDream_desc:(JiemengS ...
- eclipse快速定位java对应的class
当前设置值,只能定位class文件 设置eclipse External Tools Configurations... Program --> new New 创建viewclass.bat文 ...
- 以太网数据包、IP包、TCP/UDP 包的结构(转)
源:以太网数据包.IP包.TCP/UDP 包的结构 版本号(Version):长度4比特.标识目前采用的IP协议的版本号.一般的值为0100(IPv4),0110(IPv6). IP包头长度(Head ...