collections是Python内建的一个集合模块,提供了许多有用的集合类。
本文将介绍以下几种方法:
namedtuple
Counter()
deque
OrderedDict
一、namedtuple
namedtuple
是一个函数,它用来创建一个自定义的tuple
对象,并且规定了tuple
元素的个数,可以用属性而不是索引来引用tuple
的某个元素。
因为tuple是不可变类型,所以用namedtuple定义出来的对象经过初始化以后,对象的属性是不可以改变的。
>>> from collections import namedtuple >>> Stu = namedtuple("Student",["name","age","score"]) >>> s = Stu("张三",17,450) >>> s Student(name='张三', age=17, score=450) >>> s.name '张三' >>> s.score 450 >>> s.age 17 >>> s.age=30 Traceback (most recent call last): File "<pyshell#79>", line 1, in <module> s.age=30 AttributeError: can't set attribute >>>
验证对象s是Stu的对象,也是tuple的一种子类
>>> isinstance(s,Stu) True >>> isinstance(s,tuple) True
同样的,如果要表示一个四边形的宽高:
>>> TR = namedtuple("TR",["width","height"]) >>> t = TR(10,20) >>> t TR(width=10, height=20) >>> t.width 10 >>> t.height 20
二、Counter()
Counter是一个简单的计数器,用来统计一个字符串中每个字符出现的次数。
>>> from collections import Counter >>> c = Counter() >>> c Counter() >>> for x in "whoami I am you": c[x] += 1 >>> c Counter({' ': 3, 'o': 2, 'a': 2, 'm': 2, 'w': 1, 'h': 1, 'i': 1, 'I': 1, 'y': 1, 'u': 1}) >>> for x in c: print(x,c[x]) w 1 h 1 o 2 a 2 m 2 i 1 3 I 1 y 1 u 1
用c.key排序再删除:
>>> for x in sorted(c.keys()): print(x,c[x]) 3 I 1 a 2 h 1 i 1 m 2 o 2 u 1 w 1 y 1
三、deque
使用list
存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list
是线性存储,数据量大的时候,插入和删除效率很低。
deque是高效实现插入和删除操作的双向list,适合用于栈和队列
>>> from collections import deque >>> l = [1,4,9,-10] >>> q = deque(l) >>> q deque([1, 4, 9, -10]) >>> q.append(100) >>> q.pop() 100 >>> q.appendleft(0) >>> q deque([0, 1, 4, 9, -10]) >>> q.popleft() 0 >>> q deque([1, 4, 9, -10])
除了实现list的append()
和pop()
外,还支持appendleft()
和popleft(),
可以非常高效地往头部添加或删除元素。
四、OrderedDict
使用dict
时,Key是无序的。如果要保持Key的插入顺序,可以用OrderedDict,
OrderedDict
的Key会按照插入的顺序返回,不是Key本身排序。
>>> od = OrderedDict() >>> od['z'] = 1 >>> od['y'] = 2 >>> od['x'] = 3 >>> list(od.keys()) # 按照插入的Key的顺序返回 ['z', 'y', 'x']