jasper的技术小窝

关注DevOps、运维监控、Python、Golang、开源、大数据、web开发、互联网

python中的collections数据类型

作者:jasper | 分类:python | 标签:     | 阅读 1255 次 | 发布:2014-09-15 9:49 p.m.

在python中,为大家所熟知的数据类型,主要有list, tuple, dict,set等,但是,有时候有些特殊的需求,仅仅是这几个数据类型,根本不好去实现。其实在python中, collections模块在这些内置数据类型的基础上,提供了几个额外的数据类型:
namedtuple: 生成可以使用名字来访问元素内容的tuple子类
deque: 双端队列,类似于队列,可以从另外一侧追加和推出对象
Counter: 计数器,主要用来计数
OrderedDict: 有序字典
defaultdict: 带有默认值的字典

下面来分别说说它们的用法:

namedtuple:

其实看名字就明白,就是为tuple里面的元素指定名字,是不是有点像dict的赶脚。

>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(x=1, y=2)     # 生成实例
>>> p 
Point(x=1, y=2)
>>> p[0] + p[1]             # index用法
3
>>> p.x + p.y               # 通过名字获取值
3

namedtuple常用的有一个_make方法_make(iterable):

>>> t = [1, 2]   
>>> Point._make(t) 
Point(x=1, y=2)

deque:

双端队列,实现了从队列 头部快速增加和取出对象,其实这个需求用list也可以实现:

>>>l = [1,2,3]
>>>l.insert(0,4)  #在index为0的地方插入4
>>>l
[4,1,2,3]
>>>l.pop(0)
4
>>>l
[1,2,3]

但是每次插入或是取出,其他的index都会变,时间复杂度是 O(n) ,也就是说随着元素数量的增加耗时呈 线性上升。而使用deque对象则是 O(1) 的复杂度,所以当你的代码有这样的需求的时候, 一定要记得使用deque。

from collections import deque
d = deque('abc')
d.append('d')  #默认是右边
d.pop() 
d.appendleft("e")  #指定左边
d.popleft()

特别地:

#返回最后n行文本
deque(open(filename), n)

Counter:

计数器功能,可以为str,list等去计数:

>>>import collections
>>>collections.Counter(['a', 'b', 'c', 'a', 'b', 'b'])
Counter({'b': 3, 'a': 2, 'c': 1})
>>>collections.Counter("aaddbc")
Counter({'a': 2, 'd': 2, 'c': 1, 'b': 1})

注意得到的结果,排序是从大到小的,特别地, 得到出现频率最高的:

>>>a = collections.Counter("aaddbc")
>>> a.most_common(2)
 [('a', 2), ('d', 2)]

OrderedDict:

有序的字典,在Python中,dict这个数据结构由于hash的特性,是无序的。常规dict并不跟踪插入顺序,迭代处理时会根据键在散列表中存储的顺序来生成值。 在OrderedDict中则相反,它会记住元素的插入顺序,并在创建迭代器时候使用中这个顺序。

>>>from collections import OrderedDict
>>>a=collections.OrderedDict()  
>>> a['d']='1'  
>>> a['c']='3'  
>>> a['b']='4'  
>>> a  
OrderedDict([('d', '1'), ('c', '3'), ('b', '4')]) 

defaultdict:

我们都知道,在使用Python原生的数据结构dict的时候,如果用 d[key] 这样的方式访问, 当指定的key不存在时,是会抛出KeyError异常的。 但是,如果使用defaultdict,只要你传入一个默认的类型,那么请求一个不存在的key时, 便会调用这个类型使用其默认结果来作为这个key的默认值。

最常用的应用场景是:

>>>from collections import defaultdict
>>>d = defaultdict(list)  #使用list初始化一个dict
>>>d["a"].append(1)   #如果用dict会报KeyError异常
>>>d["b"].append(2)
>>>d["3"].append(3)
>>>d
defaultdict(, {'a': [1], '3': [3], 'b': [2]})

终于说完了,希望对你有所帮助,能在以后的开发中提供帮助。


转载请注明出处:http://www.opscoder.info/python_collections.html

其他分类: