【文档学习】Python模块——collections(OrderedDict,包括Dict增加元素)

本系列【文档学习】记录了博主学习Python3.7.2中的各个模块的笔记。官方文档。

本文记录了数据类型容器(container datatypes)collections模块,源代码。记录博主用到的部分,持续更新。更新于2019.03.21。

文章目录

  • 综述
  • OrderedDict
      • OrderedDict 范例和方法(recipes)

综述

这个模块实现了特殊数据容器,提供了Python标准内置容器dict,list,set和tuple之外的选择。

容器 说明
namedtuple() 用于用已命名的场(named fields)创建tuple子类的工厂函数(factory function)
deque 类似list的容器,在两端都有快速添加(appends)和弹出(pops)
ChainMap 类似dict的类,用于创建一个multiple mappings的单独视角(single view)
Counter dict子类别,用于计数可哈希目标(hashable objects)
OrderedDict dict子类别,在增加位置记录了order entries
defaultdict dict子类别,调用工厂函数(factory function)以供应缺少的值(supply missing values)
UserDict 用于更简单的dict subclassing的封装dictionary objects
UserList 用于更简单的list subclassing的封装list objects
UserString 用于更简单的string subclassing的封装string objects

从版本3.3开始,将Collections Abstract Base Classes移入了collections.abc模块。为了反向兼容性,在Python 3.7中它们仍然在这个模块中可见。后续会被完全移除。

OrderedDict

class collections.OrderedDict([ items ])

返回一个dict子集实例,其有专门为重新排序(rearranging dictionary order)的方法。

版本3.1新增

popitem(last=True)

popitem方法用于有序dictionaries返回和移除一个(key, value)对。如果last是true这些对(pairs)以LIFO(last in first out)顺序放回,如果是false以FIFO(first in first out)形式排序。

move_to_end(key, last=True)

讲一个已经存在的key移动到一个已排序的dictionary的某一端。如果last是true(默认)就移动到最右端,如果是false就移动到最开始。如果key不存在会引发KeyError。

>>> d = OrderedDict.fromkeys('abcde')
>>> d.move_to_end('b')
>>> ''.join(d.keys())
'acdeb'
>>> d.move_to_end('b', last=False)
>>> ''.join(d.keys())
'bacde'

版本3.2新增

除了通常的映射方法,ordered dictionaries也支持用reversed()进行循环迭代。

OrderedDict目标之间的质量测试(equality test)的实现用list(od1.items())==list(od2.items())。OrderedDict目标和其他映射目标之间的质量测试是像常规dictionaries一样的顺序不敏感(order-insensitive)。这允许OrderedDict目标能够适应任意使用常规dictionary的场景。

在版本3.5中的修改:item,keys和values对OrderedDict的视角目前支持用reversed()实现循环迭代。

在版本3.6中的修改:有了PEP 468的支持,keyword arguments的顺序在传递到OrderedDict添加链接描述构造函数和其update()方法时被保留。

OrderedDict 范例和方法(recipes)

创建一个ordered dictionary变量是很直接的,即记住最后插入的keys的顺序。如果一个新的入口覆盖了一个已经存在的如果,那么原始的插入位置被改变并移到最后:

class LastUpdatedOrderedDict(OrderedDict):
    'Store items in the order the keys were last added'

    def __setitem__(self, key, value):
        super().__setitem__(key, value)
        super().move_to_end(key)

OrderedDict对于实施functools.lru_cache()有帮助。

class LRU(OrderedDict):
    'Limit size, evicting the least recently looked-up key when full'

    def __init__(self, maxsize=128, *args, **kwds):
        self.maxsize = maxsize
        super().__init__(*args, **kwds)

    def __getitem__(self, key):
        value = super().__getitem__(key)
        self.move_to_end(key)
        return value

    def __setitem__(self, key, value):
        super().__setitem__(key, value)
        if len(self) > self.maxsize:
            oldest = next(iter(self))
            del self[oldest]

增加元素

collections.OrderedDict([('conv1', nn.Conv2d(1,20,5)), ('relu1', nn.ReLU()), ('conv2', nn.Conv2d(20,64,5)), ('relu2', nn.ReLU()) ])

与之对应的,dict的元素增加方法

Dict={}
Dict.update({'conv1' : nn.Conv2d(1,20,5), 'relu1': nn.ReLU(), 'conv2' : nn.Conv2d(20,64,5), 'relu2' : nn.ReLU() })

你可能感兴趣的:(笔记,Python基础)