提出问题:
有时候,我们希望能在迭代或者其他处理过程中,保留最后几个符合要求的内容记录。
解决思路:
保存最后N个元素或者有限历史记录,可以用到collections.deque方法。例如,在一个文件里面查找,符合要求的文字,当发现有成功匹配的就输出当前的匹配行以及最后检查过的N行文本。
from collections import deque #导入deque模块
def search(lines,pattern,history=5):
previous_lines=deque(maxlen=history)
for line in lines: #循环遍历
if pattern in line:
yield line ,previous_lines #yield 生成器,暂时保存返回当前变量
previous_lines.append(line)
if __name__ == '__main__':
with open('SearchPython.txt') as f: #打开本地文件
for line ,prevlines in search(f,'python',5): #在此文件中搜索,规则是python ,次数是5次
for pline in prevlines:
print(pline,end='') #下面是格式输出
print(line,end='')
print('-'*20)
本地一个SearchPython.txt文档
12python
python10
pppython1
wepython
qqpython12
查看搜索后结果:
12python
--------------------
12python
python10
--------------------
12python
python10
pppython1
--------------------
12python
python10
pppython1
wepython
--------------------
12python
python10
pppython1
wepython
qqpython12
--------------------
深入讨论:
上面代码中的deque(maxken=N),其实是创建了一个固定长度的队列,有记录来临时会在尾部插入,当队列满时,自动移除最老的那条记录。比如:
更简单而又普遍的方式是,如果我们不指定队列的大小,就会得到一个没有边界的队列,可以在两端执行添加和弹出操作,比如:
时间复杂度分析:
从队列两端添加或弹出元素的复杂度都是O(1),这一点是和列表是有区别的。当从列表的头部插入或移除元素时,由于所有的元素都自动向前或向后移位,列表的时间复杂度为O(N)。