python学习系列---collections模块

1.Counter Counter是对字典类型的补充,用于追踪值的出现次数。它具备字典的所有功能。在python的内部实现中,Counter类继承了dict类。

1.1 基本用法
>>> import collections
>>> obj = collections.Counter('I Dreamed A Dream')    
>>> obj
Counter({' ': 3, 'e': 3, 'a': 2, 'D': 2, 'm': 2, 'r': 2, 'I': 1, 'A': 1, 'd': 1})
>>> Counter统计了字符串中每个字符出现的次数

>>> print type(obj)
<class 'collections.Counter'> #Counter对象的类型

In [8]: obj.most_common(3) #这个方法在python3中才有
Out[8]: [(' ', 3), ('e', 3), ('a', 2)] #获取出现次数最多的前n个字符,n为参数。

In [12]: for k,v in obj.items():
    ...:     print k, v
    ...:     
a 2 #与dict拥有相同的获取items的方法,keys(),values()方法也相同。
  3
e 3
D 2
1
m 2
r 2
A 1
d 1

In [17]: obj.update(["But","The","Tigers","Come","At","Night"])
In [19]: print obj
Counter({'A': 1, 'Come': 1, 'I': 1, 'Dreamed': 1, 'Tigers': 1, 'But': 1, 'At': 1, 'Night': 1, 'The': 1, 'Dream': 1}) #可以更新Counter

In [20]: obj.subtract(["But","The","Tigers","Come","At","Night"])
In [21]: print obj
Counter({'A': 1, 'I': 1, 'Dreamed': 1, 'Dream': 1, 'Come': 0, 'Tigers': 0, 'But': 0, 'At': 0, 'Night': 0, 'The': 0}) #减少元素

In [24]: obj.subtract(["But","The","Tigers","Come","At","Night"])
In [25]: print obj
Counter({'A': 1, 'I': 1, 'Dreamed': 1, 'Dream': 1, 'Come': -2, 'Tigers': -2, 'But': -2, 'At': -2, 'Night': -2, 'The': -2}) #元素个数可以是负数。


2. OrderedDict
OrderedDict 是一个有序的字典类型,它同样具有字典的所有方法。

2.1 基本用法
In [26]: odic = collections.OrderedDict()
In [28]: odic['a']=1
In [29]: odic['b']=2
In [30]: odic['c']=3

In [31]: odic
Out[31]: OrderedDict([('a', 1), ('b', 2), ('c', 3)]) #顺序不变
In [32]: odic
Out[32]: OrderedDict([('a', 1), ('b', 2), ('c', 3)]) #顺序不变

In [33]: odic.setdefault('d')
In [34]: odic
Out[34]: OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', None)]) #设默认值为None
In [35]: odic.setdefault('d',4)
In [36]: odic
Out[36]: OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', None)])
In [37]: odic['d']=4
In [38]: odic
Out[38]: OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4)])

In [42]: odic.move_to_end('a')
Out[42]: OrderedDict([('b', 2), ('c', 3), ('d', 4),('a', 1)]) #将元素移动到最后

In [43]: odic.pop('c')
Out[43]: 3 #取出指定的元素
In [44]: odic
Out[44]: OrderedDict([('a', 1), ('b', 2), ('d', 4)])

In [45]: odic.update({'e':5,'f':6})
In [46]: odic
Out[46]: OrderedDict([('a', 1), ('b', 2), ('d', 4), ('e', 5), ('f', 6)]) #更新字典


3. defaultdict
defaultdict 为字典的每个元素指定一个默认的value类型。

3.1 基本用法
In [47]: ddic = collections.defaultdict(list)
In [48]: ddic['a'].append('No')
In [49]: ddic['a'].append('Song')
In [50]: ddic['a'].append('Unsung')
In [52]: ddic
Out[52]: defaultdict(list, {'a': ['No', 'Song', 'Unsung']})

In [53]: ddic['b'].append('No')
In [54]: ddic['b'].append('Wine')
In [55]: ddic['b'].append('Untasted')
In [57]: ddic
Out[57]: defaultdict(list, {'a': ['No', 'Song', 'Unsung'], 'b': ['No', 'Wine', 'Untasted'})


4. namedtuple
namedtuple 创建一个可以通过名字进行访问其中元素的元组,它包含tuple的所有功能。使用时需要首先创建一个namedtuple类。

4.1 基本用法
有一个常用的场景就是给坐标轴上的点赋予坐标值。
In [58]: MyNamedTu = collections.namedtuple('MyNamedTu',['x','y','z']) #创建一个类
In [59]: obj = MyNamedTu(10,20,30)
In [60]: obj
Out[60]: MyNamedTu(x=10, y=20, z=30)
In [61]: obj.x
Out[61]: 10
In [62]: obj.y
Out[62]: 20
In [63]: obj.z
Out[63]: 30
在这里,我们使用namedtuple函数创建了一个MyNamedTu类,这个类有三个属性:x,y,z.  obj = MyNamedTu(10,20,30)这一句就相当于创建了一个对象,这个对象的三个属性x=10,y=20,z=30. 现在应该明白为什么同样是collections的模块,namedtuple不像collections模块里其他的功能一样直接使用一个类,而是要创建一个类了,一个原因就是我们要使用的类的属性是不确定的。


5. deque
deque 是一个线程安全的双向队列,它是python内置的队列。

5.1 基本用法
append(),appendleft(),clear(),copy(),count(),extend(),extendleft(),index(),insert(),remove(),revert(),rotate(),

In [66]: deq = collections.deque()
In [68]: deq.append(1)
In [69]: deq.appendleft(10)
In [70]: deq.appendleft(1)
In [72]: deq
Out[72]: deque([1, 10, 1])
In [73]: deq.count(1)
Out[73]: 2
In [74]: deq.extend([2,3,4])
In [75]: deq
Out[75]: deque([1, 10, 1, 2, 3, 4])
In [77]: deq.rotate()
In [78]: deq
Out[78]: deque([4, 1, 10, 1, 2, 3]) #从右边拿元素放到左边,默认为一个元素
In [79]: deq.rotate(2)
In [80]: deq
Out[80]: deque([2, 3, 4, 1, 10, 1]) #从右边拿指定个数的元素放到左边


5.Queue.Queue
Queue 是python中的一个单向队列,不是内置的,需要import.

用法略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值