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

            

  • 相关阅读:
    Key-Value Memory Network
    Deep Mask Memory Network with Semantic Dependency and Context Moment for Aspect Level Sentiment Clas
    Deep Memory Network在Aspect Based Sentiment方向上的应用
    Deep Memory Network 深度记忆网络
    Self Attention 自注意力机制
    Attention基本公式及其变种
    *端策略优化算法(PPO)
    Policy Gradient 算法
    一本通 农场派对
    A
  • 原文地址:https://www.cnblogs.com/lyq-biu/p/10756957.html
Copyright © 2011-2022 走看看