dict、defaultdict 和 OrderedDict 比较
一.dict、defaultdict 和 OrderedDict 常见的方法比较
| dict | defaultdict | OrderdDict | 方法作用 | |
| d.clear() | √ | √ | √ | 移除所有元素 |
| d.__contains__(k) | √ | √ | √ | 检查 k 是否在 d 中 |
| d.copy() | √ | √ | √ | 浅复制 |
| d.__copy__() | √ | 用于支持 copy.copy | ||
| .default_factory | √ |
在 __missing__ 函数中被调用的 |
||
| d.__delitem__(k) | √ | √ | √ | del d[k],移除键为 k 的元素 |
|
d.fromkeys(it, |
√ | √ | √ |
将迭代器 it 里的元素设置为映射 |
| d.get(k,[default]) | √ | √ | √ | 返回键 k 对应的值,如果字典里
没有键 k,则返回 None 或者 |
| d.__getitem__(k) | √ | √ | √ |
让字典 d 能用 d[k] 的形式返回键 |
| d.items() | √ | √ | √ | 返回 d 里所有的键值对 |
| d.__iter__() | √ | √ | √ | 获取键的迭代器 |
| d.keys() | √ | √ | √ | 获取所有的键 |
| d.__len__() | √ | √ | √ |
可以用 len(d) 的形式得到字典里 |
| d.__missing__(k) | √ |
当 __getitem__ 找不到对应键的 |
||
|
d.move_to_end(k, |
√ |
把键为 k 的元素移动到最靠前或 |
||
| d.pop(k, [defaul] | √ | √ | √ |
返回键 k 所对应的值,然后移除 |
| d.popitem() | √ | √ | √ |
随机返回一个键值对并从字典里 |
| d.__reversed__() | √ | 返回倒序的键的迭代器 | ||
|
d.setdefault(k, |
√ | √ | √ |
若字典里有键k,则把它对应的值 |
|
d.__setitem__(k, |
√ | √ | √ |
实现 d[k] = v 操作,把 k 对应的 |
|
d.update(m, |
√ | √ | √ |
m 可以是映射或者键值对迭代 |
| d.values() | √ | √ | √ | 返回字典里的所有值 |
注:1.default_factory 并不是一个方法,而是一个可调用对象(callable),它的值在defaultdict 初始化的时候由用户设定。
2.OrderedDict.popitem() 会移除字典里最先插入的元素(先进先出);同时这个方法还有一个可选的 last 参数,若为真,则会移除最后插入的元素(后进先出)(而dict和defaultdict则是随机移除);
3.dict.keys()在Python3中的返回值是一个“视图”。视图就像一个集合,而且跟字典类似的是,在视图里查找一个元素的速度很快;Python2中返回的是一个列表,查询慢。
二.映射的弹性查询
有时候为了方便起见,就算某个键在映射里不存在,我们也希望在通过这个键读取值的时候能得到一个默认值。有两个途径能帮我们达到这个目的,一个是通过 defaultdict 这个类型而不是普通的 dict,另一个是给自己定义一个 dict 的子类,然后在子类中实现 __missing__ 方法。
1.collections.defaultdict:

步骤:
(1) 调用 list() 来建立一个新列表。
(2) 把这个新列表作为值,'new-key' 作为它的键,放到 dd 中。
(3) 返回这个列表的引用。而这个用来生成默认值的可调用对象存放在名为 default_factory 的实例属性里。
注:defaultdict 里的 default_factory 只会在__getitem__ 里被调用,在其他的方法里完全不会发挥作用。比如,dd 是个 defaultdict,k 是个找不到的键, dd[k] 这个表达式会调用 default_factory 创造某个默认值,而 dd.get(k) 则会返回 None。
2.__miss__方法:
如果一个类继承了dict,且实现了__miss__()方法,则在调用__getitem__()方法找不到键时(即d["test"]没有这个键)不会直接抛出KeyError。
3.collections.OrderedDict和collections.ChainMap和collections.Counter:
3.1collections.OrderedDict:
这个类型在添加键的时候会保持顺序,因此键的迭代次序总是一致的。
3.2collections.ChainMap:
该类型可以容纳数个不同的映射对象,然后在进行键查找操作的时候,这些对象会被当作一个整体被逐个查找,直到键被找到为止。
3.3collections.Counter:
这个映射类型会给键准备一个整数计数器。每次更新一个键的时候都会增加这个计数器。一般用做计数。
4.如果要自定义映射类型,一般不会直接继承dict,而是继承collections.UserDict 类:
倾向于从 UserDict 而不是从 dict 继承的主要原因是,后者有时会在某些方法的实现上走一些捷径,导致我们不得不在它的子类中重写这些方法,但是 UserDict 就不会带来这些问题。内置类型的方法不会调用子类覆盖的方法。例如,dict 的子类覆盖的 __getitem__() 方法不会被内置类型的get() 方法调用等。
注:
UserDict 并不是 dict 的子类,但是UserDict 有一个叫作 data 的属性,是 dict 的实例,这个属性实际上是 UserDict 最终存储数据的地方。这样做的好处是,UserDict 的子类就能在实现 __setitem__ 的时候避免不必要的递归,也可以让 __contains__ 里的代码更简洁。
dict、defaultdict 和 OrderedDict 比较的更多相关文章
- 关于字典的几个类--defaultdict,OrderedDict, zip()
一. 1个键对应多个值 比如:d = {'a' : [1, 2, 3], 'b' : [4, 5]},可以使用 collections 模块中的 defaultdict 来构造这样的字典 from ...
- Python - DICT 字典排序 - OrderedDict
官方地址: https://docs.python.org/2/library/collections.html#collections.OrderedDict >>> # regu ...
- python-Day3-set 集合-counter计数器-默认字典(defaultdict) -可命名元组(namedtuple)-有序字典(orderedDict)-双向队列(deque)--Queue单项队列--深浅拷贝---函数参数
上节内容回顾:C语言为什么比起他语言块,因为C 会把代码变异成机器码Pyhton 的 .pyc文件是什么python 把.py文件编译成的.pyc文件是Python的字节码, 字符串本质是 字符数组, ...
- collections系列之OrderedDict【有序字典】与DefaultDict【默认字典】
今天来向大家介绍一下collections系列中的OrderedDict和DefaultDict,这两种类均是通过collections来创建的,均是对dict字典加工,所有都继承了dict字典的方法 ...
- python的defaultdict
defaultdict是dict的一个子类,接受一个工厂函数作为参数,当访问defaultdict中不存在的key时,会将工厂函数的返回值作为默认的value. class defaultdict(d ...
- defaultdict的威力
>>> from collections import defaultdict >>> s='mmississippi' >>> d=defaul ...
- python中的OrderedDict
该类型存放顺序和添加顺序一致,比如逐个赋值,但和dict直接转化过去的顺序不一定一样. d1 = collections.OrderedDict() d1['b'] = 'B'd1['a'] = 'A ...
- Python高手之路【三】python基础之函数
基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...
- python-基本数据类型
/int整数/ 如: 18.73.84 每一个整数都具备如下功能: class int(object): """ int(x=0) -> int or long i ...
随机推荐
- 【Python3爬虫】百度一下,坑死你?
一.写在前面 这个标题是借用的路人甲大佬的一篇文章的标题(百度一下,坑死你),而且这次的爬虫也是看了这篇文章后才写出来的,感兴趣的可以先看下这篇文章. 前段时间有篇文章<搜索引擎百度已死> ...
- 如何在IIS上发布网站
本片博客记录一下怎么用IIS发布一个网站,以我自己电脑上一个已经开发完成的网站为例: 1.打开项目 这是我电脑上的一个项目,现在我记录一下将这个项目发布到iis上的整个过程: 2.在vs2017中发布 ...
- c# jobject 的数据结构的解析:
c# jobject 数据结构的解析:首先下载Newtonsoft.Json,增加引用using Newtonsoft.Json.Linq;把jobject的内容提取出来,Jobject的内容格式如下 ...
- spring2.0 mybatis JDBC配置
mybatis 搭建 <!--连接池--> <dependency> <groupId>org.springframework.boot</groupId&g ...
- 解析高德地图api获取省市区,生成最新三级联动sql表
前言: 最近项目中用到了全国省市区三级信息,但是网上找到的信息都是比较旧的信息.与现在最新的地区信息匹配不上.后来想到高德地图上可能有这些信息.所以解析了一下api接口,生成了相关省市区的sql信息. ...
- mybatis 参数格式异常-- Error querying database. Cause: java.lang.NumberFormatException: For input string
mybatis中 <if></if>标签中进行判断时,如果传入的时字符格式和数字进行判断需要将数字进行转译,否则默认是数字和数字进行比较,这是就会出现参数格式异常如<if ...
- PHP八大设计模式
设计模式 单例模式解决的是如何在整个项目中创建唯一对象实例的问题,工厂模式解决的是如何不通过new建立实例对象的方法. 单例模式 $_instance必须声明为静态的私有变量 构造函数和析构函数必须声 ...
- git status 显示中文乱码
场景 在使用git命令行查看当前 状态时, git status 显示中文文件乱码: 解决 修改git配置, git config --global core.quotepath false
- HeadFirst设计模式读书笔记之策略模式
1. 例子 1. 做一个鸭子模拟器,里面有很多不同的鸭子,有的可以游泳,有的可以睡觉,有的可以呱呱叫,一般套路是定义一个鸭子的超类,在 超类里定义睡觉,游泳,呱呱叫的方法,再让不同的鸭子子类继承这个超 ...
- Android Interpolator解析
本文部分图片转自:https://blog.csdn.net/lgaojiantong/article/details/39451243 目录 自定义插值器 系统插值器 1. 自定义插值器 要自定义插 ...