[TOC=1,5] >[success] # 双向队列 双向队运行处理速度较快,从队列两端添加或弹出数据元素的复杂程度 O(1),列表的复杂程度为O(N) <a href="https://wiki.python.org/moin/TimeComplexity">参考链接</a> 一个deque(双端队列)在内部被表示为一个双链表。(好吧,是数组而不是对象的列表,以提高效率。)两端都是可访问的,但即使是在中间看也是很慢的,而且从中间添加或删除也会更慢。 ![](https://box.kancloud.cn/6deddcc7f94fce47c051176685b36a6f_368x292.png) >[info] ## 基本使用 `collections` -- `收集的意思` >[danger] ##### deque-maxlen 设置长度 先进先出 ~~~ from collections import deque d = deque(maxlen=3) d.extend(['a','b','c','d','e']) print(d) 打印结果: deque(['c', 'd', 'e'], maxlen=3) ~~~ >[danger] ##### deque-append 右添加数据 * 添加速度O(1) ~~~ from collections import deque d = deque() d.append(1) d.append(2) print(d) 打印结果: deque([1, 2]) ~~~ >[danger] ##### deque-appendleft 左添加数据 * 添加速度O(1) ~~~ from collections import deque d = deque() d.append(1) d.append(2) d.appendleft(3) print(d) 打印结果: deque([3, 1, 2]) ~~~ >[danger] ##### deque-clear 清除数据 ~~~ from collections import deque d = deque() d.append(1) d.append(2) d.clear() print(d) 打印结果: deque([]) ~~~ >[danger] ##### deque-copy(浅拷贝) * copy速度 O(n) ~~~ from collections import deque d = deque() d.append(1) d.append(2) new_d = d.copy() print(new_d) 打印结果: deque([1, 2]) ~~~ >[danger] ##### deque-count(返回指定元素的出现次数) ~~~ from collections import deque d = deque() d.append(1) d.append(3) d.append(3) print(d.count(3)) 打印结果: 2 ~~~ >[danger] ##### deque-extend(从队列右边扩展一个列表的元素) * 添加速度等于 添加列表决定O(K) ~~~ from collections import deque d = deque() d.append(1) d.append(3) d.append(3) d.extend([1,5,6]) print(d) 打印结果: deque([1, 3, 3, 1, 5, 6]) ~~~ >[danger] ##### deque-extendleft(从队列左边扩展一个列表的元素) * 添加速度等于 添加列表决定O(K) ~~~ from collections import deque d = deque() d.append(1) d.append(3) d.append(3) d.extendleft([1,5,6]) print(d) 打印结果注意添加的列表顺序也反过来了: deque([6, 5, 1, 1, 3, 3]) ~~~ >[danger] ##### deque-index(查找某个元素的索引位置) ~~~ from collections import deque d = deque() d.append(1) d.append(3) d.append(4) d.append(3) print(d) print(d.index(3)) # 相同时值显示第一个的位置 print(d.index(3,2,4)) # 指定查找区间 打印结果: deque([1, 3, 4, 3]) 1 3 ~~~ >[danger] ##### deque-insert(在指定位置插入元素) ~~~ from collections import deque d = deque() d.extend(['a','b','c','d','e']) d.insert(2,'z') print(d) 打印结果: deque(['a', 'b', 'z', 'c', 'd', 'e']) ~~~ >[danger] ##### deque-pop(获取最右边一个元素,并在队列中删除) * 删除速度等于 添加列表决定O(1) ~~~ from collections import deque d = deque() d.extend(['a','b','c','d','e']) d.pop() print(d) 打印结果: deque(['a', 'b', 'c', 'd']) ~~~ >[danger] ##### deque-popleft(获取最左边一个元素,并在队列中删除) * 删除速度等于 添加列表决定O(1) ~~~ from collections import deque d = deque() d.extend(['a','b','c','d','e']) d.popleft() print(d) 打印结果: deque(['b', 'c', 'd', 'e']) ~~~ >[danger] ##### deque-remove(删除指定元素) * 删除速度等于 添加列表决定O(K) ~~~ import collections d = collections.deque() d.extend(['a','b','c','d','e']) d.remove('c') print(d) 打印结果: deque(['a', 'b', 'd', 'e']) ~~~ >[danger] ##### deque-reverse(队列反转) ~~~ import collections d = collections.deque() d.extend(['a','b','c','d','e']) d.reverse() print(d) 输出: deque(['e', 'd', 'c', 'b', 'a']) ~~~ >[danger] ##### deque-rotate(把右边元素放到左边) * 速度等于 添加列表决定O(K) ~~~ from collections import deque d = deque() d.extend(['a','b','c','d','e']) d.rotate(2) # 数字决定右面几个变成左面 print(d) 输出: deque(['d', 'e', 'a', 'b', 'c']) ~~~ >[success] # 案例 >[danger] ##### 关键词匹配成功后,打印匹配前的内容和匹配内容 ~~~ from collections import deque def search(lines,pattern,history=5): previous_lines = deque(maxlen=history) for line in lines: # 匹配成功才返回,匹配内容 if pattern in line: yield line,previous_lines previous_lines.append(line) print(previous_lines) with open("somefile.txt") as f: # 匹配成功了 yield 中才有对应的返回值 for line,prevlines in search(f,"python",5): for pline in prevlines: print(pline,end=" ") print(line,end='') print("-"*20) ~~~