collections模块

在内置数据类型(list ,tuple ,dict ,set)的基础上,collections提供了几个额外的数据类型:

  1. namedtuple: 生成可以使用名字来访问元素内容的tuple
  2. deque: 双端队列,可以快速的从另外一侧追加或取出元素
  3. OrderedDict: 有序字典
  4. defaultdict: 带有默认值的字典
  5. Counter: 计数器,主要用来计数

namedtuple:    命名元组/有名元组

主要用于描述一类东西,这类东西都有相同的特征

from collections import namedtuple
res = namedtuple('name',['x','y','z'])          # ‘name’ 就是 元组名    []里面就是元组的 元素
ret = res(2,3,4)            #传参  一一对应
print(ret)              # name(x=2, y=3, z=4)
print(ret.x)            # 2
print(ret.y)            # 3
print(ret.z)            # 4

deque    双端队列

 

先说一下,Python还有个queque模块,支持Queue()单向队列:

import queue

q = queue.Queue()       
print(q.empty())                # 判断Queue()队列是否为空,    返回True,就是空
#True 

q = queue.Queue(1)     
q.put(1)
print(q.full())     #判断Queue()队列是否满了
#True           

q = queue.Queue()    
q.put(1)
q.put(2)
q.put('a')
q.put('b')
print(q.get())          # 1     先进先出 FIFO:first in first out
print(q.get())          # 2
print(q.get())          # 3
print(q.get())          # 4
# print(q.get())        #4个元素,取了5次值,空了,get不到,就一直等待,程序不结束
print(q.get_nowait())  # 报错 queue.Empty  get不到就停止并报错

list的线性存储
列表查询很快:索引查询
列表插入操作就费时间了:线性存储
  线性存储:往列表中插入一个元素,插入位置后面的所有元素位置都要变化

双端队列:

打个比喻:list列表的append()方法,在后面尾巴添加,很快,不存在线性存储的问题,而双端对列就相当于有两个尾巴(无头),前面后面都可以append()

from collections import deque
dq = deque()
dq.append(1)
dq.append(2)
dq.appendleft('a')
dq.appendleft('b')
print(dq)               #deque(['b', 'a', 1, 2])
print(dq.pop())         # 2 从后面取值
print(dq.popleft())     # b 从前面(左)取值

OrderedDict     有序字典

排列有序:

from collections import OrderedDict
dic = dict([('a', 1), ('b', 2), ('c', 3)])      #创建字典的另一种方法
print(dic)
# {'a': 1, 'c': 3, 'b': 2}     dict的Key是无序的

od = OrderedDict(    [  ('a', 1), ('b', 2), ('c', 3)  ]    )
print(od)
#([('a', 1), ('b', 2), ('c', 3)])     OrderedDict的Key是有序的

取值顺序:

from collections import OrderedDict
od = OrderedDict()
od['a'] = 1
od['b'] = 2
od['c'] = 3
print(od.keys())        #有序字典取值:  先进先出
#odict_keys(['a', 'b', 'c'])   

defaultdict:     默认字典 (默认值)

使用原生字典时,如果引用的key不存在,就会返回一个KeyError: ,如果想key不存在时,返回一个默认值,就用defaultdict

示例:

values = [11, 22, 33,44,55,66,77,88,99,90]      #把大于66和小于66的元素分别放到字典的两个key中
my_dic = {}
for i in values:
    if i > 66:
        if 'k1' in my_dic:      # 需要先判断key是不是存在
            my_dic['k1'].append(i)
        else:my_dic['k1'] = [i]     # 如果不存在,还要先创建列表
    elif i < 66:
        if 'k2' in my_dic:
            my_dic['k2'].append(i)
        else:my_dic['k2'] = [i]
print(my_dic)
#{'k2': [11, 22, 33, 44, 55], 'k1': [77, 88, 99, 90]}

如果使用默认字典  defaultdict

from collections import defaultdict
#my_dic1 = defaultdict([])   #用了一个空列表TypeError: first argument must be callable or None
my_dic1 = defaultdict(list)     #如果key不存在,默认返回一个空列表
for i in values:
    if i > 66:
        my_dic1['k1'].append(i)
    elif i < 66:
        my_dic1['k2'].append(i)
print(my_dic1)
#defaultdict(<class 'list'>, {'k2': [11, 22, 33, 44, 55], 'k1': [77, 88, 99, 90]})

Counter   计数器

跟踪值出现的次数.
是一个 无序的 容器类型
以字典的键值对形式存储 元素(key):次数(value)

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

 

posted @ 2017-10-19 19:11  静静别跑  阅读(144)  评论(0编辑  收藏  举报