所有例子代码均来自于Flask的 7fca843b5f 版本
collections是python一个非常常用的扩展库,其内置了counter, defaultdict, deque, namedtuple, ordereddict五种数据类型。今天就简单了解一下这个非常有用的常用库。
一下各例中使用的数据结构均在collections库中,所以在使用前务必import collections
Counter
顾名思义,Counter
是一个计数器,它主要的功能是对一个序列里的各个元素进行计数,接下来通过例子来简单了解一下用法。(除了以下操作,Counter
还支持+,-,|,&操作)
#初始化
>>>a = collections.Counter(['a', 'b', 'c', 'a', 'b', 'b'])
>>>b = collections.Counter({'a':2, 'b':3, 'c':1})
>>>c = collections.Counter(a = 2, b = 3, c = 1)
>>>d = collections.Counter('abcabb')
Counter({'b':3, a:'2', 'c':1})
#更新
>>>a.update(a = 4)
Counter({'b':3, 'a':4, 'c':1})
#访问
>>>b['c']
1
>>>list(c.elements())
['a', 'a', 'b', 'b', 'b', 'c']
#一个简单的应用
c = collections.Counter()
with open('wordcount.txt', 'w') as f:
for line in f:
c.update(line.rstrip().lower())
for letter, count in c.most_common(10):
print letter, count
defaultdict
defaultdict
可以看做是一个特殊的dict,它事先为所有未定的键提供了一个默认值。
>>>d = collections.defaultdict('default value', 'special' = 'the one')
>>>d['who']
'default value'
>>>d['where']
'default value'
>>>d['special']
'the one'
deque
deque
是一个双端队列,除了支持list
本身的一些操作之外,还支持从两端进行元素的插入和删除。栈和队列可以看做是deque
在某种程度上的退化形式。
>>>dq = collections.deque()
>>>dq.extend('abcd')
deque(['a', 'b', 'c', 'd'])
>>>dq.extendleft(['z'])
deque(['z', 'a', 'b', 'c', 'd'])
>>>dq.append('e')
deque(['z', 'a', 'b', 'c', 'd', 'e'])
>>>dq.appendleft('w')
deque(['w', 'z', 'a', 'b', 'c', 'd', 'e'])
>>>dq.pop()
'e'
>>>dq.popleft()
'w'
>>>dq.rotate(3)
deque(['b', 'c', 'd', 'z', 'a'])
namedtuple
标准的tuple
仅可以循秩访问,而namedtuple
提供了用键访问tuple
的方法。
>>>Person = collections.namedtuple('Person', 'name age gender')
>>>jack = Person(name = 'Jack', age = 17, gender = 'male')
>>>rose = Person(name = 'Rose', age = 19, gender = 'female')
>>>rose[0]
'Rose'
>>>jack.name
'Jack'
OrderedDict
标准dict
由于内部使用哈希策略,倒置数据存储顺序不确定。而OrderedDict
提供了有序dict
的数据结构。可以简单理解为dict + 有序
。
#这是一个普通的字典
>>>d = {1:1, 2:2, 3:3}
>>>od = collections.OrderedDict()
>>>od[1] = 1
>>>od[2] = 2
>>>od[3] = 3
>>>for k,v in d.items():
... print k, v
1 1
3 3
2 2
>>>for k, v in od.items():
... print k, v
1 1
2 2
3 3
上面简单介绍了collections里几种数据结构,它是python内置数据结构的有效补充,恰当的数据结构可以为我们的编程提供便捷,或者提高我们的编程效率。