1-2 collections中deque,defaultdic
2018-12-29 本文已影响0人
小龙虾0o0
deque
使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈。
-------摘自廖大的官方网站
deque支持各种双向插入操作,如popleft,appendleft
代码如下:
import collections
l = collections.deque(maxlen= 5)
l.extend([1, 2, 3, 4, 5, 6])
print(l)
>>> deque([2, 3, 4, 5, 6], maxlen=5)
l.appendleft(1)
print(l)
>>> deque([1, 2, 3, 4, 5], maxlen=5)
l.popleft()
print(l)
>>> deque([2, 3, 4, 5], maxlen=5)
在队列两端插入或删除元素时间复杂度都是 O(1) ,而在列表的开头插入或删除元素的时间复杂度为 O(N)
collections.deque中很重要的就是maxlen的应用,它限制了最大长度,如果超出会顶掉另一侧的元素。依靠它我们可以写出更为简洁的代码
defaultdict
collections.defaultdict可以用来实现字典的一键对应多值,多个值需要存储再另一个容器内
代码如下:
import collections
d = collections.defaultdict(list) #这里可以写 list 或者 set,具体视需求而定
d[1].append(1)
d[1].append(2)
d['1'].append(1)
print(d)
>>> defaultdict(<type 'list'>, {'1': [1], 1: [1, 2]})
多值容器的选取,要考虑容器的特性,list ——有序,set——去重
OrderedDict
Python中字典是无序的,但是有时候需要使用有序的字典,这时候要用到OrderedDict,它构建的字典里有依据插入顺序排序的双向链表,但是它占用内存大小是普通字典的两倍。