zoukankan      html  css  js  c++  java
  • collections模块

    collections模块

    			——数据类型扩展模块
    

    有序字典

    • python3.6后所有字典有序了
    • 特殊用法:
      1. move_to_end(key)
    from collections import OrderedDict
    d = OrderedDict([('a',1),('b',2)])
    d.move_to_end('a')
    print(d)
    输出结果:OrderedDict([('b', 2), ('a', 1)])
    

    默认字典

    • 作用:当访问一个字典的键不存在时,实例化一个值当做默认值
    from collections import defaultdict
    d = defaultdict(list)
    print(d['a'])
    print(d)
    
    输出:
    

    • 默认字典的实现机制:
    1. 第一步首先对默认字典进行默认赋值只有两种情况,第一种就是在通过dict[key],第二种就是通过字典类中的__getitem__方法才可以进行默认赋值
      • 直接对默认字典的进行对不存在的键值对的删除是会报错的
    from collections import defaultdict
    d = defaultdict(list)
    d.pop('a')          #删除一个没有的键值对
    
    输出:
    

    	证明:并不是键值对一直就在里面,虽然可以有默认值,但是前提是需要创建
    
    1. 第二步通过子类中的__missing__特殊方法,对未存在的键进行赋值,触发__missing__的机制就是dict[key]__getitem__,从python2.5版本开始,如果派生自dict的子类定义了__missing__()方法,当访问不存在的键时,dict[key]会调用__missing__()方法取得默认值。

      字典类里是没有__missing__方法的,只有在派生子类中自己去实现

    class Missing(dict):
        def __missing__(self, key):
            self[key] = list()
            return 'default'
    d = Missing()
    d['Foo']
    print(d)
    
    输出的答案:
    

    • 自主实现defaultdict类
    class My_DefaultDict(dict):
        def __init__(self,default_factory=None,**kwargs):
            dict.__init__(self,**kwargs)
            self.default_factory = default_factory
    
        def __getitem__(self, key):
            try:
                return dict.__getitem__(self,key)
            except KeyError:
                return self.__missing__(key)
        def __missing__(self, key):
            if self.default_factory == None:
                self[key] = value = self.default_factory
            else:
                self[key] = value = self.default_factory()
            return value
    
    d = My_DefaultDict(list)
    d['a'].append(1)
    print(d)
    
    输出:
    

    得出的结果和使用defaultdict实现的一样。
    

    可命名元组(namedtuple)

    • 作用:给元组取名
    from collections import namedtuple
    Msg = namedtuple('Msg',['name','sex','age'])
    m1 = Course('Abner','male','22')
    print(m1)
    输出:Msg(name='Abner', sex='male', age='22')
    
    • 优点:
    1. 保留了元组的特性

    2. 让用户可以明确了解每个值的明确含义

    3. 十分类似一个只有属性没有方法的类,列表中的就是属性名

      这种类的特点,不能修改实例化的值了

    双端队列(deque)

    • 作用:可以补全list的缺点,insert速度过慢

    • 什么是队列?

      在python中有queue模块,队列类在该模块内,Queue类

      队列的原则:先进先出,后进后出

      • 功能:

        q = queue.Queue()
        q.get()            拿到数据
        q.put()            放数据
        
    • 应用场景:排队抢票队列

    • 双端队列的优势:在两边都可以取值

    • 特殊方法

    1. dq.append() 在队列右侧追加
    2. dq.appendleft() 在队列左侧追加
    3. dq.pop() 删除队列末尾的一个元素
    4. dq.popleft() 删除第一个元素
    5. dq.rotate(n) 旋转,n为正数从左向右移n个元素,移除的元素在队列头补上
    from collections import deque
    dq = deque([1,2,3,4,5])
    dq.rotate(-2)
    print(dq)
    输出:deque([3, 4, 5, 1, 2])   向前推了两个元素
    
    • 存储结构

    每个元素都有前指针和后指针,确定自己所在位置

    遇到insert不要使用list列表,因为效率过低,使用deque更优。

    • 计数器(Counter)

    作用:统计可迭代对象的元素出现次数

    c = Counter('abcdeabcdabcaba')
    print c
    输出:Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
    

    支持update:

    from collections import Counter
    c = Counter('adhskfgufhgfuhafkah')
    print(c)
    c.update('dhajhdakdhhf')
    print(c)
    输出:
    Counter({'h': 4, 'f': 4, 'a': 3, 'k': 2, 'g': 2, 'u': 2, 'd': 1, 's': 1})
    Counter({'h': 8, 'a': 5, 'f': 5, 'd': 4, 'k': 3, 'g': 2, 'u': 2, 's': 1, 'j': 1})
    
  • 相关阅读:
    图灵科普系列丛书封面有奖征集(贴图送书)
    图灵2010.03书讯
    博客园图灵杯第4届博问大赛(2.27~3.27)
    asp.net运行原理
    IIS与NET桥梁
    offsetParent解释
    XML 操作类库(开源项目)
    W3C不兼容问题(最根本的原因,及解决方案)
    深入理解JavaScript系列
    HttpApplication对象创建的细节
  • 原文地址:https://www.cnblogs.com/abner28/p/9594110.html
Copyright © 2011-2022 走看看