本系列【文档学习】记录了博主学习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() })