collections模块在内置数据类型(dict、list、set、tuple)的基础上,还提供了几个额外的数据类型:ChainMap、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就能用上了。 

namedtuple(\'名称\',‘属性list’)

from collections import namedtuple
Point = namedtuple(\'Point\',[\'x\',\'y\'])
p = Point(1,2)
print(p.x)  # 1
print(p.y)  # 2

可以验证创建的Point对象是tuple的一种子类:

print(isinstance(p,Point))  # True
print(isinstance(p,tuple))  # True

 

deque

  使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。deque为了高效实现插入和删除操作的双向列表,适合用于队列和栈。

from collections import deque
q = deque([\'a\',\'b\',\'c\',\'d\'])
q.append(\'e\')
q.appendleft(\'A\')
print(q)    # deque([\'A\', \'a\', \'b\', \'c\', \'d\', \'e\'])
q.pop()
q.popleft()
print(q)    # deque([\'a\', \'b\', \'c\', \'d\'])

 

defaultdict

  使用dict时,如果引用的Key不存在,就会抛出异常。如果希望key不存在时,返回一个默认值,就可以使用defaultdict。

 

from collections import defaultdict
d = defaultdict(lambda:\'N/A\')
d[\'key1\'] = \'abc\'
print(d[\'key1\'])    # abc
print(d[\'key2\'])    # N/A

 

注意默认值是调用函数返回的,而函数在创建defaultdict对象是传入。

除了在key不存在时返回默认值,defaultdict的其他行为跟dict是完全一样的。

 

OrderDict

使用字典时,key是无序的。在对字典做迭代时,我们无法确定key的顺序。如果要保持key的顺序,可以用OrderedDict

from collections import OrderedDict
d = dict([(\'a\',1),(\'b\',2),(\'c\',3)])
print(d)    # {\'a\': 1, \'c\': 3,\'b\': 2}   dict的key是无序的
od = OrderedDict([(\'a\',1),(\'b\',2),(\'c\',3)])
print(od)   # OrderedDict([(\'a\', 1), (\'b\', 2), (\'c\', 3)])   OrderedDict的key是有序的

意,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序:

from collections import OrderedDict
od = OrderedDict()
od[\'z\'] = 1
od[\'y\'] = 2
od[\'x\'] = 3
print(od.keys())    # odict_keys([\'z\', \'y\', \'x\'])

 

Counter

Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。

from collections import Counter
c = Counter()
for i in \'asdsadsafjzjk\':
    c[i]+=1
print(c)    # Counter({\'a\': 3, \'s\': 3, \'d\': 2, \'j\': 2, \'f\': 1, \'z\': 1, \'k\': 1})

cc = Counter(\'asdsadsafjzjk\')
print(cc)   # Counter({\'a\': 3, \'s\': 3, \'d\': 2, \'j\': 2, \'f\': 1, \'z\': 1, \'k\': 1})

 

收藏 打印