zoukankan      html  css  js  c++  java
  • dict、defaultdict 和 OrderedDict 比较

    一.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__ 里的代码更简洁。

            

  • 相关阅读:
    Java 开源博客 Solo 2.5.0 发布
    redis集群部署及踩过的坑
    开源巨献:年度最佳 JavaScript 和 CSS 开源库推荐!
    Java9 新特性 详解
    eclipse 安装教程
    博客园代码高亮插件(类似csdn的代码插入)
    【超详细教程】使用Windows Live Writer 2012和Office Word 2013 发布文章到博客园全面总结
    软件测试学习视频 分享
    Oracle imp exp 导入导出 执行脚本
    在Ubuntu 15下搭建V/P/N服务器pptpd安装和配置
  • 原文地址:https://www.cnblogs.com/lyq-biu/p/10756957.html
Copyright © 2011-2022 走看看