一.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,
[initial])

将迭代器 it 里的元素设置为映射
里的键,如果有 initial 参数,
就把它作为这些键对应的值(默
认是 None)

 d.get(k,[default]) 返回键 k 对应的值,如果字典里

没有键 k,则返回 None 或者
default

d.__getitem__(k)

让字典 d 能用 d[k] 的形式返回键
k 对应的值

d.items() 返回 d 里所有的键值对
d.__iter__() 获取键的迭代器
d.keys() 获取所有的键
d.__len__()

可以用 len(d) 的形式得到字典里
键值对的数量

d.__missing__(k)    

当 __getitem__ 找不到对应键的
时候,这个方法会被调用

d.move_to_end(k,
[last]

   

把键为 k 的元素移动到最靠前或
者最靠后的位置(last 的默认值
是 True)

d.pop(k, [defaul]

返回键 k 所对应的值,然后移除
这个键值对。如果没有这个键,
返回 None 或者 defaul

d.popitem()

随机返回一个键值对并从字典里
移除它

d.__reversed__()     返回倒序的键的迭代器

d.setdefault(k,
[default])

若字典里有键k,则把它对应的值
设置为 default,然后返回这个
值;若无,则让 d[k] =default,然后返回 default

d.__setitem__(k,
v)

实现 d[k] = v 操作,把 k 对应的
值设为v

d.update(m,
[**kargs])

m 可以是映射或者键值对迭代
器,用来更新 d 里对应的条目

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 比较的更多相关文章

  1. 关于字典的几个类--defaultdict,OrderedDict, zip()

    一.  1个键对应多个值 比如:d = {'a' : [1, 2, 3],  'b' : [4, 5]},可以使用 collections 模块中的 defaultdict 来构造这样的字典 from ...

  2. Python - DICT 字典排序 - OrderedDict

    官方地址: https://docs.python.org/2/library/collections.html#collections.OrderedDict >>> # regu ...

  3. python-Day3-set 集合-counter计数器-默认字典(defaultdict) -可命名元组(namedtuple)-有序字典(orderedDict)-双向队列(deque)--Queue单项队列--深浅拷贝---函数参数

    上节内容回顾:C语言为什么比起他语言块,因为C 会把代码变异成机器码Pyhton 的 .pyc文件是什么python 把.py文件编译成的.pyc文件是Python的字节码, 字符串本质是 字符数组, ...

  4. collections系列之OrderedDict【有序字典】与DefaultDict【默认字典】

    今天来向大家介绍一下collections系列中的OrderedDict和DefaultDict,这两种类均是通过collections来创建的,均是对dict字典加工,所有都继承了dict字典的方法 ...

  5. python的defaultdict

    defaultdict是dict的一个子类,接受一个工厂函数作为参数,当访问defaultdict中不存在的key时,会将工厂函数的返回值作为默认的value. class defaultdict(d ...

  6. defaultdict的威力

    >>> from collections import defaultdict >>> s='mmississippi' >>> d=defaul ...

  7. python中的OrderedDict

    该类型存放顺序和添加顺序一致,比如逐个赋值,但和dict直接转化过去的顺序不一定一样. d1 = collections.OrderedDict() d1['b'] = 'B'd1['a'] = 'A ...

  8. Python高手之路【三】python基础之函数

    基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...

  9. python-基本数据类型

    /int整数/ 如: 18.73.84 每一个整数都具备如下功能: class int(object): """ int(x=0) -> int or long i ...

随机推荐

  1. 分布式事务解决方案FESCAR

    项目地址:FESCAR 以下是官网的文档.简介2019年,Fescar 是 阿里巴巴 开源的 分布式事务中间件,以 高效 并且对业务 0 侵入 的方式,解决 微服务 场景下面临的分布式事务问题. 1. ...

  2. SpringBoot技术栈搭建个人博客【前台开发/项目总结】

    前言:写前台真的是我不擅长的东西...所以学习和写了很久很久...前台页面大概开发了两天半就开发好了,采用的静态的html和bootstrap来写,写后台的时候纠结住了...怎么说呢,写页面真的是头疼 ...

  3. 谈谈我理解的SA——Systems Architecture

    什么是SA? SA即Systems Architecture,是系统体系结构. 系统体系结构是定义系统的结构.行为和系统视图的概念模型.架构师将其系统的形式化描述或表示出来,以支持结构和行为的推理的方 ...

  4. java锁与监视器概念 为什么wait、notify、notifyAll定义在Object中 多线程中篇(九)

    在Java中,与线程通信相关的几个方法,是定义在Object中的,大家都知道Object是Java中所有类的超类 在Java中,所有的类都是Object,借助于一个统一的形式Object,显然在有些处 ...

  5. 从PRISM开始学WPF(三)Prism-Region-更新至Prism7.1

    [7.1update]在开始前,我们先看下版本7.1中在本实例中的改动. 首先,项目文件中没有了Bootstrapper.cs,在上一篇的末尾,我们说过了,在7.1中,不见推荐使用Bootstrapp ...

  6. cocos creator主程入门教程(六)—— 消息分发

    五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以TypeScript为介绍语言. 本篇开始介绍游戏业务架构相关的内容.在游戏业务层,所有需要隔离的系统和模块间通信都可以通过消息分发解耦. ...

  7. axios(封装使用、拦截特定请求、判断所有请求加载完毕)

    博客地址:https://ainyi.com/71 基于 Promise 的 HTTP 请求客户端,可同时在浏览器和 Node.js 中使用 vue2.0之后,就不再对 vue-resource 更新 ...

  8. 【Json】fastjson与jackson常用操作记录

    本文只是记录fastjson.jackson一些常用的操作方法,没作比较,网上写比较的文章很多啦. 1.对象转Json串 // fastjson String objStr = JSON.toJSON ...

  9. vue学习记录①(vue-cli脚手架构建项目结构)

    我们直接从vue的工程化开始入手. 在这里用git命令行搭建项目环境.(当然直接cmd命令行下也是一样的) git下载安装地址:https://www.git-scm.com/download/win ...

  10. 用Python写一个贪吃蛇

    最近在学Python,想做点什么来练练手,命令行的贪吃蛇一般是C的练手项目,但是一时之间找不到别的,就先做个贪吃蛇来练练简单的语法. 由于Python监听键盘很麻烦,没有C语言的kbhit(),所以这 ...