colletctions是Python内置的一个集合模块,拥有很多有用的集合类。
namedtuple
我们知道tuple表示不变的集合,例如,一个点的二维坐标:
>>>p =(1,2)
但是看到(1,2)很难看出这个tuple是表示一个坐标:
定义一个class又小题大做,这是namedtuple就派上用场:
>>>from collections import namedtuple
>>>Point =namedtuple('Point',['x','y'])
>>>p = Point(1,2)
>>>p.x
1
>>>p.y
2
namedtuple是一个函数,它用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,并且可以用属性而不是索引来引用tuple的某个元素。这样一来,我们用namedtuple很方便的定义一种数据类型,它具备了tuple不变的特性,又可以根据属性来引用,非常方便。
可以验证创建的Point对象是一个Tuple子类:
>>>isinstance(p,Point)
True
>>>isinstance(p,tuple)
True
类似,如果要用坐标和半径表示一个圆,也可以使用namedtuple定义:
Circle =namedtuple('circle',['x','y','r'])
deque
使用list存储数据时,按索引访问数据很快,但是插入和删除就很慢,因为list是线性存储,数据量很大时,插入和删除效率很低。
deque是为了高效率实现插入和删除的双向列表,是和用于队列和栈:
>>>from collections import deque
>>>q =deque(['a','b','c'])
>>>q.append('x')
>>>q.appendleft('y')
>>>q
deque(['y','a','b','c','x'])
deque除了实现list的append()和pop()外,还支持appendleft()和popleft(),这样可以非常高效的往头部添加或者删除数据。
defaultdict
使用dict时,如果引用的key不存在,就会抛出keyerror。如果希望key不存在时返回一个默认值,可以使用defaultdict:
>>>from collections import defaltdict
>>>dd =defaultdict(lambda: 'N/A')
>>>dd['key1'] ='abc'
>>>dd['key1']
'abc'
>>>dd['key2']
'N/A'
注意默认值是调用函数返回的,而函数在创建defaultdict对象时传入。
除了在key不存在时返回默认值,defaultdict的其他行为与dict一样。
OrderedDict
使用dict时,key是无序的。在对dict做迭代时,我们无法确定key的顺序。
如果想保持key的顺序,可以使用OrderedDict:
>>>from collections import OrderedDict
>>>d =dict([('a',1),('b',2),('c',3)])
>>>d
{'a':1,'c':3,'b':2}
>>>od =OrderedDict([('a',1),('b',2),('c',3)])
>>>od
OrderedDict(['a':1,'b':2,'c':3])
注意,OrderedDict的key会按照插入的顺序排列,而不是key本身排序:
>>>od =OrderedDict()
>>>od['z'] =1
>>>od['y'] =2
>>>od['x'] =3
>>>list(od.keys())
['z','y','x']
OrderedDict可以实现一个FIFO(先进先出)的Dict,当容量超出限制时,先删除最先添加的key:
from collections import OrderedDict
class LastUpdateOrderdeDict(OrderDict):
def __init__(self,capacity):
super(LastUpdateOrderedDict,self).__init__()
self.capacity =capacity
def __set_item__(self,key,value):
containsKey =1 if key in self else 0
if len(self) -containsKey >=self._capacity:
last =self .popitem(last =False)
print('remove:',last)
if containsKey:
del self[key]
print('set:',(key,value)
else:
print('add:',(key,value))
OrderDict.__setitem__(self,key,value)
Counter
Counter是一个简单的计数器,例如,统计字符出现的个数:
>>>from collections import Counter
>>>c =Counter()
>>>for ch in 'programming':
c[ch] = c[ch] +1
>>>c
Counter({'g':2,'m':2,'r':2,'a':1,'i':1,'o':1,'n':1,'p':1})
Counter实际上也是dict的一个子类,上面的结果可以看出,字符'g','m','r'各出现两次,其他字符出现一次。
小结:
collections包含了一些有用的集合类,可以根据需要选用。