collections模块介绍
collections模块介绍
基本介绍
我们都知道,Python拥有一些内置的数据类型,比如str, int, list, tuple, dict等, collections模块在这些内置数据类型的基础上,提供了几个额外的数据类型:
- namedtuple(): 生成可以使用名字来访问元素内容的tuple子类。
- deque: 双端队列,可以快速的从另外一侧追加和推出对象。
- Counter: 计数器,主要用来计数。
- OrderedDict: 有序字典。
- defaultdict: 带有默认值的字典。
1.namedtuple()
namedtuple主要用来产生可以使用名称来访问元素的数据对象,通常用来增强代码的可读性, 在访问一些tuple类型的数据时尤其好用。
我们知道tuple可以表示不变集合,例如:一个点的二维坐标就可以表示成:p=(1,2)。但是,看到(1,2),很难看出这个tuple是用来表示一个坐标的。这时,namedtuple就派上用场了。
from collections import namedtuple Point = namedtuple('point',['x','y','z']) p1 = Point(1,2,3) p2 = Point(3,2,1) print(p1.x) print(p1.y) print(p1,p2)
这里定义了一个三维的坐标点(x,y,z),通过所命名的量来进行整体传值得到P1,P2点,这样就可以得到这个点各自对应的值。可通过p1.x和p1.y进行参数值查看。很明显增强了代码的可读性。
得到的结果为:
1
2
point(x=1, y=2, z=3) point(x=3, y=2, z=1)
下面来看一个关于扑克牌和圆的定义:
Card = namedtuple('card',['suits','number']) c1 = Card('红桃',2) print(c1) print(c1.number) print(c1.suits) #类似的,要用坐标和半径表示一个圆,也可以用namedtuple定义: namedtuple('名称',[属性list]): Circle=namedtuple('Circle',['x','y','r'])
2.deque
deque其实是 double-ended queue 的缩写,翻译过来就是双端队列,它最大的好处就是实现了从队列 头部快速增加和取出对象: .popleft(), .appendleft() 。
使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为llist实线性存储,数据量大的时候,插入和删除效率都很低。
deque是为了高效实现插入和删除操作的双向列表,适合于队列和栈。
from collections import deque q=deque(['a','b','c']) q.append('x') q.appendleft('y') print(q)
deque除了实现list的append()和pop()外,还支持appendleft()和popleft(),这样就可以很高效的往头部添加或删除元素。
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.pop()) # 从后面取数据 print(dq.pop()) # 从后面取数据 print(dq.popleft()) # 从前面取数据 print(dq)
2.1 队列(queue)
先进先出 FIFO。
import queue #导入队列模块 q = queue.Queue()#创建一个空队列 q.put([1,2,3]) #通过put()向队列中添加元素 q.put(5) q.put(6) print(q) #队列对象 print(q.get()) #通过.get()方法取值, print(q.get()) print(q.get()) print(q.get()) #当队列没值时则会出现阻塞 print(q.qsize()) #获取队列大小
3.Counter
计数器是一个非常常用的功能需求,collections也贴心的为你提供了这个功能。
下面这个例子就是使用Counter模块统计一段句子里面所有字符出现次数 from collections import Counter s = '''A Counter is a dict subclass for counting hashable objects. It is an unordered collection where elements are stored as dictionary keys and their counts are stored as dictionary values. Counts are allowed to be any integer value including zero or negative counts. The Counter class is similar to bags or multisets in other languages.'''.lower() c = Counter(s) print(c.most_common(5))
结果如下:[(' ', 54), ('e', 32), ('s', 25), ('a', 24), ('t', 24)]。
4.OrderedDict
在Python中,dict这个数据结构由于hash的特性,是无序的(在对dict做迭代时,我们无法确定key的顺序),这在有的时候会给我们带来一些麻烦。 幸运的是,collections模块为我们提供了OrderedDict,当你要获得一个有序的字典(保持key的顺序)对象时,用它就对了。
from collections import OrderedDict d=dict([('a',1),('b',2),('c',3)]) print(d) #dict的key是无序的 od=OrderedDict([('a',1),('b',2),('c',3)]) print(od) #OrderedDict的key是有序的
注意:OrderedDict的key会按照插入的顺序排列,不是key本身排序。
from collections import OrderedDict od=OrderedDict() od['z']=1 od['y']=2 od['x']=3 print(od)
结果显示:OrderedDict([('z', 1), ('y', 2), ('x', 3)])。按照插入的key的顺序返回。
from collections import OrderedDict od = OrderedDict([('a', 1), ('b', 2), ('c', 3)]) print(od) # OrderedDict的Key是有序的 print(od['a']) for k in od: print(k)
5.defaultdict
我们都知道,在使用Python原生的数据结构dict的时候,如果用 d[key] 这样的方式访问,当指定的key不存在时,是会抛出KeyError异常的。但是,如果使用defaultdict,只要你传入一个默认的工厂方法,那么请求一个不存在的key时,便会调用这个工厂方法使用其结果来作为这个key的默认值。
from collections import defaultdict members = [ # Age, name ['male', 'John'], ['male', 'Jack'], ['female', 'Lily'], ] result = defaultdict(list) for sex, name in members: result[sex].append(name) print result
结果如下:defaultdict(<type 'list'>, {'male': ['John', 'Jack'], 'female': ['Lily']})。
函数传值
from collections import defaultdict d = defaultdict(lambda : 5) print(d['k'])
结果:
5
defaultdict(<function <lambda> at 0x0000000002E9D5E8>, {'k': 5})。
可以看到通过函数传值,并通过键赋值得到一个键值对。
浙公网安备 33010602011771号