提出问题:

有时候,我们希望能在迭代或者其他处理过程中,保留最后几个符合要求的内容记录。

解决思路:

保存最后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),其实是创建了一个固定长度的队列,有记录来临时会在尾部插入,当队列满时,自动移除最老的那条记录。比如:
保存最后N个元素
更简单而又普遍的方式是,如果我们不指定队列的大小,就会得到一个没有边界的队列,可以在两端执行添加和弹出操作,比如:
保存最后N个元素

时间复杂度分析:

从队列两端添加或弹出元素的复杂度都是O(1),这一点是和列表是有区别的。当从列表的头部插入或移除元素时,由于所有的元素都自动向前或向后移位,列表的时间复杂度为O(N)

相关文章:

  • 2021-09-11
  • 2021-06-09
  • 2021-12-20
  • 2022-03-07
  • 2022-12-23
  • 2022-12-23
  • 2022-02-08
  • 2021-05-15
猜你喜欢
  • 2021-09-24
  • 2021-11-13
  • 2021-06-04
  • 2022-12-23
  • 2022-12-23
  • 2021-08-28
相关资源
相似解决方案