Python 10.2 collections

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包含了一些有用的集合类,可以根据需要选用。 

你可能感兴趣的:(python,Collections)