1首先介绍下collections.deque的用法:
from collections import deque queue = deque(["Eric", "John", "Michael"]) queue.append("Terry") # Terry 入队 queue.append("Graham") # Graham 入队 queue.popleft() # 队首元素出队 #输出: 'Eric' queue.popleft() # 队首元素出队 #输出: 'John' print(queue) # 队列中剩下的元素 #输出: deque(['Michael', 'Terry', 'Graham'])
>>> q = deque(maxlen=3) >>> q.append(1) >>> q.append(2) >>> q.append(3) >>> q deque([1, 2, 3], maxlen=3) >>> q.append(4) >>> q deque([2, 3, 4], maxlen=3) >>> q.append(5) >>> q deque([3, 4, 5], maxlen=3)
#deque
类可以被用在任何你只需要一个简单队列数据结构的场合。 如果你不设置最大队列大小,
#那么就会得到一个无限大小队列,你可以在队列的两端执行添加和弹出元素的操作。
>>> q = deque() >>> q.append(1) >>> q.append(2) >>> q.append(3) >>> q deque([1, 2, 3]) >>> q.appendleft(4) >>> q deque([4, 1, 2, 3]) >>> q.pop() 3 >>> q deque([4, 1, 2]) >>> q.popleft() 4
2 解决方案
保留有限历史记录正是 collections.deque
大显身手的时候。比如,下面的代码在多行上面做简单的文本匹配, 并返回匹配所在行的最后N行:
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) # Example use on a file if __name__ == '__main__': with open(r'../../cookbook/somefile.txt') as f: for line, prevlines in search(f, 'python', 5): for pline in prevlines: print(pline, end='') print(line, end='') print('-' * 20)
原地址:http://python3-cookbook.readthedocs.io/zh_CN/latest/c01/p03_keep_last_n_items.html