本系列【文档学习】记录了博主学习Python3.7.2中的各个模块的笔记。官方文档。
本文记录了数据类型容器(container datatypes)collections模块,源代码。记录博主用到的部分,持续更新。更新于2019.03.21。
综述
这个模块实现了特殊数据容器,提供了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() })