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})
posted @ 2018-09-05 19:53  AbnerLing  阅读(97)  评论(0编辑  收藏  举报