Collections模块
collections包含了一些特殊的容器,针对Python内置的容器,例如list、dict、set和tuple,提供了另一种选择;
- namedtuple,可以创建包含名称的tuple;
- deque,类似于list的容器,可以快速的在队列头部和尾部添加、删除元素;
- Counter,dict的子类,计算可hash的对象;
- OrderedDict,dict的子类,可以记住元素的添加顺序;
- defaultdict,dict的子类,可以调用提供默认值的函数;
namedtuple:用于创建自定义的元组对象,并支持使用属性访问元组中的元素。
from collections import namedtuple
point = namedtuple('point', ['x', 'y'])
p = point(1, 2)
print (p.x, p.y)
1 2
deque:
高效实现插入和删除操作的双向队列对象,适合用于队列和栈。Deque 支持线程安全,内存高效添加(append)和弹出(pop),从两端都可以,两个方向的大概开销都是 O(1) 复杂度。
方法:
- append()
- appendleft()
- clear()
- copy()
- count(x)
- extend(iterable)
- extendleft(iterable)
- index(x)
- insert(i, x)
- pop()
- popleft()
- remove(value)
- reverse()
- rotate(n):向右循环移动 n 步。 如果 n 是负数,就向左循环。如果deque不是空的,向右循环移动一步就等价于 d.appendleft(d.pop()) , 向左循环一步就等价于 d.append(d.popleft()) 。
from collections import deque
q = deque(['a', 'b', 'c'])
q.append('x')
q.appendleft('y')
q
deque(['y', 'a', 'b', 'c', 'x'])
list(reversed(q))
['x', 'c', 'b', 'a', 'y']
q
deque(['y', 'a', 'b', 'c', 'x'])
q.rotate(2)
q
deque(['c', 'x', 'y', 'a', 'b'])
q.rotate(-2)
q
deque(['y', 'a', 'b', 'c', 'x'])
Counter :统计字符出现的次数
from collections import Counter
d = Counter(q)
d
Counter({'y': 1, 'a': 1, 'b': 1, 'c': 1, 'x': 1})
defaultdict :defaultdict是内置数据类型dict的一个子类,基本功能与dict一样,只是重写了一个方法missing(key)和增加了一个可写的对象变量default_factory。
from collections import defaultdict
d = defaultdict(lambda: 'null')
d['a'] = 1
d['a']
1
d['b']
'null'
OrderedDict:OrderedDict类似于正常的词典,只是它记住了元素插入的顺序,当在有序的词典上迭代时,返回的元素就是它们第一次添加的顺序。
- popitem(last=True):有序字典的 popitem() 方法移除并返回一个 (key, value) 键值对。 如果 last 值为真,则按 LIFO 后进先出的顺序返回键值对,否则就按 FIFO 先进先出的顺序返回键值对。
- move_to_end(key, last=True):将现有 key 移动到有序字典的任一端。 如果 last 为真值(默认)则将元素移至末尾;如果 last 为假值则将元素移至开头。如果 key 不存在则会触发 KeyError:
from collections import OrderedDict
d = dict([('a', 1), ('c', 3), ('b', 2)])
d
{'a': 1, 'c': 3, 'b': 2}
new_d = OrderedDict()
new_d['a'] = 1
new_d['b'] = 2
new_d['c'] = 3
new_d
OrderedDict([('a', 1), ('b', 2), ('c', 3)])
new_d.move_to_end('b')
new_d
OrderedDict([('c', 3), ('a', 1), ('b', 2)])
new_d.move_to_end('b', last = False)
new_d
OrderedDict([('b', 2), ('c', 3), ('a', 1)])