python包含数据结构包含list列表、tuple元组、dict字典、set集合这些都是内置类型。collections模块包含多种数据结构的实现,扩展了其他模块中的相应结构。例如deque是一个双端对列。从任意一端增加或删除元素。defaultdict是一个字典,,如果找不到某个建,他会响应一个默认值,ordereddict会记住增加元素的序列。nametuple扩展了一个tuple处了为每个成员元素提供一个数值索引外还提供一个属性名。
对于大量数据array会比list更高效地利用内存。由于array仅限一种数据类型,与通用的list相比,它可以采用一种更紧凑的内存表示
构建列表或数组还有一种选择即bisect它即使一种二分查找算法查找新元素,效率较高。
尽管内置list可以使用insert、pop方法模拟队列,但这不是线程安全的,要完成线程间的时序通信,可以使用queue模块。multiprocessing包含一个queue的版本。他会处理进程进的他会处理进程间的通信。
struct对于解码另一个应用的数据就会很有用,可以将这些数据解码为python的内置类型,以便于处理。
collection——容器数据类型
collection模块包含除内置类型list、dict和tuple外的其他类型。
counter
counter是一个容器,可以跟踪相同的值增加了多少次,这个类可以用来实现其他语言中常用包bag或多集合multiset数据结构来实现的算法。
初始化counter有3中方法。调用counter的构造函数时可以提供一个元素序列或者一个包含键和计数的字典,还可以使用关键字参数将字符串名映射到计数器。
示例代码如下:
import collections as co
print co.Counter(['a','b','c'])Counter({'a': 1, 'c': 1, 'b': 1})
counter函数可以使用空参数,然后使用update进行填充,示例代码如下:
c = collections.Counter()
print cCounter()
c.update('abcdaab')
print c
Counter({'a': 3, 'b': 2, 'c': 1, 'd': 1})
print cCounter({'a': 3, 'b': 2, 'c': 1, 'd': 1})
print cCounter({'a': 3, 'b': 2, 'c': 1, 'd': 1})
c.update({'a':1,'d':5})
print cCounter({'d': 6, 'a': 4, 'b': 2, 'c': 1})
一旦Counter填充结束,既可以用字典API获取他的值。
import collections
c = collections.Counter()
c.update('abcdaab')
for letter in 'abcde':
print ' %s :%d' % (letter,c[letter])
a : 3
b : 2
c : 1
d : 1
e : 0
elements()方法返回一个迭代器,将生成counter知道的所有元素,但是包能保证元素的顺序不变,且计数小于或等于0的元素不包含在内。
import collections
c = collections.Counter('extremely')
c['z'] = 0
print c
print list(c.elements())['e', 'e', 'e', 'm', 'l', 'r', 't', 'y', 'x']
使用most_common()可以生成一个序列,其中包含n个最常遇到的输入值及相应计数
示例代码如下:
import collections
c = collections.Counter()
with open('/usr/share/dict/words','rt') as f:
for line in f:
c.update(line.rstrip().lower())
for letter, count in c.most_common(3):
print '%s: %7d' % (letter, count)
算术操作
Counter实例支持算术和集合操作来完成结果的聚集。
defaultdict
标准字典包括一个方法setdefault()来获取一个值,如果这个值不存在则建立一个默认值,与之相反,defaultdict初始化容器时会让调用者提前指定默认值。
import collections
def default_factory():
return 'default value'
d = collections.defaultdict(default_factory,foo='bar')
print 'd:',d
print 'foo=>',d['foo']
print 'bar =>',d['bar']default value
deque 双端队列
deque双端队列支持从任意一端增加和删除元素,更为常见的方式是栈和队列就是双端队列的退化形式。其输入和输出限制在一端。
代码示例如下:
import collections
d = collections.deque('abcdefg')
print 'deque:', d
print 'length:',len(d)
print 'left end:',d[0]
print 'right end:',d[-1]
d.remove('c')
print 'remove(c)',d
right右端添加示例代码:
import collections
d1 = collections.deque()
d1.extend('abcdefg')
d1.append('h')
print d1
left左端代码示例:
d2 = collections.deque()
d2.extend(xrange(6))
d2.appendleft(6)
print d2
同过进程分别由两端调用示例如下:
import collections
import threading
import time
candle = collections.deque(xrange(5))
def burn(direction, nextSource):
... while True:
... try:
... next = nextSource()
... except IndexError:
... break
... else:
... print '%8s: %s' % (direction, next)
... time.sleep(0.1)
... print ' %8s done' % direction
... return
left= threading.Thread(target=burn, args=('Left',candle.popleft))
right = threading.Thread(target=burn, args=('right',candle.pop))
left.start()
deque 可以按任意一个方向旋转,而跳过一些元素。deque向右旋转使用一个正直会从又端取元素,把他们移到左端,向左旋转,使用一个负数,则从左端将元素移至右端。可以理解为拨号盘。示例代码如下:
import collections
d =collections.deque(xrange(10))print d
deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
d = collections.deque(xrange(10))
print ddeque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
d.rotate(2)
print ddeque([8, 9, 0, 1, 2, 3, 4, 5, 6, 7])
d = collections.deque(xrange(10))
d.rotate(-2)
print ddeque([2, 3, 4, 5, 6, 7, 8, 9, 0, 1])
namedtuple
标准tuple使用数值索引来访问其成员,namedtuple使用数值索引的同时还支持通过名字指定元素
import collections
person = collections.namedtuple('person','name age gender')
print type(person)<type 'type'>
bob = person(name='bob',age =30,gender='male')
print bobperson(name='bob', age=30, gender='male')
jane = person(name = 'jane',age = 20, gender='female')
print jane
person(name='jane', age=20, gender='female')
print jane.name
jane
print jane.age
20
print jane.gender
female
person1 = collections.namedtuple('person','name age sex')
bob = person1(name='s',age=20,sex='f')
print bob
person(name='s', age=20, sex='f')
namedtuple如果使用重复字段名或者系统保留字段名将引起异常,如下:
import collections
try:
... collections.namedtuple('person','name class age gender')
... except ValueError, err:
... print err
...
Type names and field names cannot be a keyword: 'class'
try:
... collections.namedtuple('person','name age gender age')
... except ValueError, err:
... print err
...
Encountered duplicate field name: 'age'
OrderdDict
OrderdDict是一个字典子类,可以记住其内容增加的顺序。