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

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

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

综述

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

容器说明
namedtuple()用于用已命名的场(named fields)创建tuple子类的工厂函数(factory function)
deque类似list的容器,在两端都有快速添加(appends)和弹出(pops)
ChainMap类似dict的类,用于创建一个multiple mappings的单独视角(single view)
Counterdict子类别,用于计数可哈希目标(hashable objects)
OrderedDictdict子类别,在增加位置记录了order entries
defaultdictdict子类别,调用工厂函数(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() })
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值