python 19 collections模块

collections
在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:
Counter、deque、defaultdict、namedtuple和orderedDict等。
1.namedtuple:生成可以使用名字来访问元素内容的tuple
2.deque:双端队列,可以快速的从另外一侧追加和推出对象
3.Counter:计数器,主要用来计数
4.orderedDict:有序字典
5.defaultdict:带有默认值的字典

namedtuple
我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成:
p = (1,2)
但是,看到(1,2),很难看出这个tuple是用来表示一个坐标的
这时,namedtuple就派上用场:
from collections import namedtuple
Point = namedtuple('Point',['x','y'])
p = Point(1,2)
print(p.x)
print(p.y)

类似的,如果要用坐标和半径表示一个圆,也可以用namedtuple定义:

from collections import namedtuple
# namedtuple('名称',[属性list])
Circle = namedtuple('Circle',['x','y','r'])
p1 = Circle(1,2,3)
p2 = Circle(3,2,1)
print(p1,p2)

花色和数字
from collections import namedtuple
Card = namedtuple('card',['suits','number'])
c1 = Card('红桃',2)
print(c1)
print(c1.suits)
print(c1.number)

队列 queue
import queue
q = queue.Queue()
q.put([1,2,3])
q.put(5)
q.put(6)
print(q)
print(q.get())
print(q.get())
print(q.get())
print(q.get())      # 这行没有值,但一直在这,叫阻塞
print(q.qsize())

deque
使用list存储数据时,按索引访问元素,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,
插入和删除效率很低
deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:
from collections import deque
dq = deque([1,2])
dq.append('a') # 从后面放数据[1,2,'a']
dq.appendleft('b')  # 从前面放数据['b',1,2,'a']
dq.insert(2,3)  # ['b',1,3,2,'a']
print(dq)
print(dq.pop())   # 从后面取数据 a
print(dq.pop())   # 从后面取数据 2
print(dq.popleft()) # 从前面取数据 b
print(dq)

OrderedDict 有序字典
使用dict时,key是无序的,在对dict做迭代时,我们无法确定key的顺序。
如果要保持key的顺序,可以用OrderdDict:
from collections import OrderedDict
d = dict([('a',1),('b',2),('c',3)])
print(d) # dict的key是无序的  {'c': 3, 'a': 1, 'b': 2}
od = OrderedDict([('a',1),('b',2),('c',3)])
print(od)

对于字典的操作都可以对有序字典操作
print(od['a'])
for i in od:
    print(i)

注意:OrderedDict的key会按照插入的顺序排列
od = OrderedDict()
od['z'] = 1
od['y'] = 2
od['x'] = 3
print(od.keys())
for i in od:
    print(i)

defaultdict 默认字典
有如下集合[11,22,33,44,55,66,77,88,99,90...],将所有大于66的值保存至字典的第一个key中,将小于
66值保存至第二个key的值中。
即:{'k1':大于66,'k2':小于66}
原来的老方法
values = [11,22,33,44,55,66,77,88,99,90]
my_dict = {}
for value in values:
    if value > 66:
        if 'k1' in my_dict:
            my_dict['k1'].append(value)
        else:
            my_dict['k1'] = [value]
    elif value < 66:
        if 'k2' in my_dict:
            my_dict['k2'].append(value)
        else:
            my_dict['k2'] = [value]
    else:
        continue
print(my_dict)
原来的老方法
用defaultdict实现
from collections import defaultdict
values = [11,22,33,44,55,66,77,88,99,90]
my_dict = defaultdict(list)
for value in values:
    if value > 66:
        my_dict['k1'].append(value)
    else:
        my_dict['k2'].append(value)
print(my_dict)

使用dict时,如果引用的key不存在,就会抛出keyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict:
from collections import defaultdict
dd = defaultdict(lambda :'N/A')
dd['k1'] = 'abc'
print(dd['k1'])
print(dd['k2'])
用defaultdict实现

 



posted @ 2019-09-11 13:49  休由  阅读(160)  评论(0编辑  收藏  举报