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中base64加密解密方法实例分析
May 16 Python
Python多线程下载文件的方法
Jul 10 Python
Python简单调用MySQL存储过程并获得返回值的方法
Jul 20 Python
Python中struct模块对字节流/二进制流的操作教程
Jan 21 Python
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
Dec 12 Python
python实现kMeans算法
Dec 21 Python
python pandas读取csv后,获取列标签的方法
Nov 12 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
Jul 31 Python
python 和c++实现旋转矩阵到欧拉角的变换方式
Dec 04 Python
python groupby 函数 as_index详解
Dec 16 Python
给 TensorFlow 变量进行赋值的方式
Feb 10 Python
Pytorch损失函数nn.NLLLoss2d()用法说明
Jul 07 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生成静态页
2006/11/25 PHP
php 仿Comsenz安装效果代码打包提供下载
2010/05/09 PHP
PHP性能优化准备篇图解PEAR安装
2011/12/05 PHP
PHP中实现接收多个name相同但Value不相同表单数据实例
2015/02/03 PHP
php连接oracle数据库的方法(测试成功)
2016/05/26 PHP
PHP递归遍历指定文件夹内的文件实现方法
2016/11/15 PHP
Linux服务器下PHPMailer发送邮件失败的问题解决
2017/03/04 PHP
JavaScript replace(rgExp,fn)正则替换的用法
2010/03/04 Javascript
灵活应用js调试技巧解决样式问题的步骤分享
2012/03/15 Javascript
JavaScript中的迭代器和生成器详解
2014/10/29 Javascript
jQuery.deferred对象使用详解
2016/03/18 Javascript
JavaScript驾驭网页-CSS与DOM
2016/03/24 Javascript
ionic js 模型 $ionicModal 可以遮住用户主界面的内容框
2016/06/06 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
2016/12/02 Javascript
详解angularJS自定义指令间的相互交互
2017/07/05 Javascript
微信小程序实现图片上传、删除和预览功能的方法
2017/12/18 Javascript
react-router v4如何使用history控制路由跳转详解
2018/01/09 Javascript
Javascript实现秒表倒计时功能
2018/11/17 Javascript
Vue+Django项目部署详解
2019/05/30 Javascript
JS对象属性的检测与获取操作实例分析
2020/03/17 Javascript
vue使用better-scroll实现滑动以及左右联动
2020/06/30 Javascript
vue 二维码长按保存和复制内容操作
2020/09/22 Javascript
[36:17]DOTA2上海特级锦标赛 - VGL音乐会全集
2016/03/06 DOTA
[01:04:14]VP vs TNC 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
[02:28]PWL开团时刻DAY3——Ink Ice与DeMonsTer之间的勾心斗角
2020/11/03 DOTA
python自动格式化json文件的方法
2015/03/11 Python
python实现简单五子棋游戏
2019/06/18 Python
在django中实现choices字段获取对应字段值
2020/07/12 Python
使用OpenCV实现人脸图像卡通化的示例代码
2021/01/15 Python
日语专业毕业生求职信
2013/12/04 职场文书
经贸日语专业个人求职信范文
2013/12/28 职场文书
心理学专业求职信
2014/06/16 职场文书
生死抉择观后感
2015/06/09 职场文书
2019幼儿教师求职信(3篇)
2019/09/20 职场文书
励志语录:时光飞逝,请学会珍惜所有的人和事
2020/01/16 职场文书
深入理解CSS 中 transform matrix矩阵变换问题
2021/08/30 HTML / CSS