Python cookbook(数据结构与算法)保存最后N个元素的方法


Posted in Python onFebruary 13, 2018

本文实例讲述了Python保存最后N个元素的方法。分享给大家供大家参考,具体如下:

问题:希望在迭代或是其他形式的处理过程中对最后几项记录做一个有限的历史记录统计

解决方案:选择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('somefile.txt') as f:
    for line, prevlines in search(f, 'python', 5):
      for pline in prevlines:
        print(pline, end='')
      print(line, end='')
      print('-'*20)

Python cookbook(数据结构与算法)保存最后N个元素的方法

正如上面的代码一样,当编写搜索某项记录的代码时,通常会用到含有yield关键字的生成器函数,将处理搜索过程的代码与使用搜索结果的代码解耦开来。具体生成器可参考本站迭代器和生成器相关内容。

deque(maxlen=N)创建一个固定长度的队列,当加入新元素而队列已满时会自动移除最老的那条记录:

>>> from collections import deque
>>> 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)
>>>

尽管可以在列表上手动完成这样的操作(append、del),但队列的这种解决方案要优雅得多,运行速度也快得多。

如果不指定队列长度,则得到一个无界限的队列,可在两端执行添加和弹出操作:

>>> q=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
>>> q
deque([1, 2])
>>>

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
利用Python如何将数据写到CSV文件中
Jun 05 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
Dec 05 Python
Django中自定义模型管理器(Manager)及方法
Sep 23 Python
python读文件的步骤
Oct 08 Python
pytorch torch.expand和torch.repeat的区别详解
Nov 05 Python
python 实现矩阵按对角线打印
Nov 29 Python
基于Python 中函数的 收集参数 机制
Dec 21 Python
使用Python串口实时显示数据并绘图的例子
Dec 26 Python
python标识符命名规范原理解析
Jan 10 Python
使用Django实现把两个模型类的数据聚合在一起
Mar 28 Python
OpenCV读取与写入图片的实现
Oct 13 Python
Python绘制词云图之可视化神器pyecharts的方法
Feb 23 Python
Python cookbook(数据结构与算法)从任意长度的可迭代对象中分解元素操作示例
Feb 13 #Python
Python cookbook(数据结构与算法)将序列分解为单独变量的方法
Feb 13 #Python
Python内置模块ConfigParser实现配置读写功能的方法
Feb 12 #Python
Python内置模块hashlib、hmac与uuid用法分析
Feb 12 #Python
20个常用Python运维库和模块
Feb 12 #Python
使用python实现BLAST
Feb 12 #Python
Python内置模块logging用法实例分析
Feb 12 #Python
You might like
PHP注释实例技巧
2008/10/03 PHP
用sql命令修改数据表中的一个字段为非空(not null)的语句
2010/06/04 PHP
php导出CSV抽象类实例
2014/09/24 PHP
PHP与SQL语句常用大全
2016/12/10 PHP
PHP 7安装使用体验之性能大提升,兼容性强,扩展支持不够(升级PHP要谨慎)
2017/07/27 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
HTML5之lang属性与dir属性的详解
2013/06/19 Javascript
js 距离某一时间点时间是多少实现代码
2013/10/14 Javascript
新增加的内容是如何将div的scrollbar自动移动最下面
2014/01/02 Javascript
JS封装cookie操作函数实例(设置、读取、删除)
2015/11/17 Javascript
jQuery实现对象转为url参数的方法
2017/01/11 Javascript
JS实现前端页面的搜索功能
2018/06/12 Javascript
react中实现搜索结果中关键词高亮显示
2018/07/31 Javascript
JavaScript日期工具类DateUtils定义与用法示例
2018/09/03 Javascript
Vue中使用 setTimeout() setInterval()函数的问题
2018/09/13 Javascript
vue-quill-editor+plupload富文本编辑器实例详解
2018/10/19 Javascript
解决Layui数据表格的宽高问题
2019/09/28 Javascript
[01:06:18]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第二场 1月26日
2021/03/11 DOTA
python使用PyFetion来发送短信的例子
2014/04/22 Python
python3.5 + PyQt5 +Eric6 实现的一个计算器代码
2017/03/11 Python
python 读取excel文件生成sql文件实例详解
2017/05/12 Python
Python3 replace()函数使用方法
2018/03/19 Python
对django xadmin自定义菜单的实例详解
2019/01/03 Python
Python日期时间Time模块实例详解
2019/04/15 Python
Pytorch to(device)用法
2020/01/08 Python
Banggood官网:面向全球客户的综合商城
2017/04/19 全球购物
薇诺娜官方网上商城:专注敏感肌肤
2017/05/25 全球购物
简述synchronized和java.util.concurrent.locks.Lock的异同
2014/12/08 面试题
委托证明的格式
2014/01/10 职场文书
员工拓展培训方案
2014/02/15 职场文书
《乡下孩子》教学反思
2014/04/17 职场文书
升职演讲稿范文
2014/05/23 职场文书
反四风对照检查材料思想汇报
2014/09/16 职场文书
父亲节感言
2015/08/03 职场文书
跟班学习心得体会(共6篇)
2016/01/23 职场文书
python读取mat文件生成h5文件的实现
2022/07/15 Python