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使用datetime模块计算各种时间间隔的方法
Mar 24 Python
Python字符串和文件操作常用函数分析
Apr 08 Python
在Python的Tornado框架中实现简单的在线代理的教程
May 02 Python
在Python中使用成员运算符的示例
May 13 Python
Eclipse和PyDev搭建完美Python开发环境教程(Windows篇)
Nov 16 Python
使用python实现tcp自动重连
Jul 02 Python
python+matplotlib绘制旋转椭圆实例代码
Jan 12 Python
python将文本中的空格替换为换行的方法
Mar 19 Python
python3连接MySQL数据库实例详解
May 24 Python
python中栈的原理及实现方法示例
Nov 27 Python
PyTorch中torch.tensor与torch.Tensor的区别详解
May 18 Python
keras 权重保存和权重载入方式
May 21 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
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
2014/10/29 PHP
PHP编写简单的App接口
2016/08/28 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
2018/08/07 PHP
浅谈PHPANALYSIS提取关键字
2019/03/08 PHP
ExtJS 2.0实用简明教程 之ExtJS版的Hello
2009/04/29 Javascript
javascript showModalDialog模态对话框使用说明
2009/12/31 Javascript
将两个div左右并列显示并实现点击标题切换内容
2013/10/22 Javascript
JS正则验证邮箱的格式详细介绍
2013/11/19 Javascript
实例讲解JQuery中this和$(this)区别
2014/12/08 Javascript
jQuery实现菜单式图片滑动切换
2015/03/14 Javascript
Javascript BOM学习小结(六)
2015/11/26 Javascript
Jquery和angularjs获取check框选中的值的方法汇总
2016/01/17 Javascript
AngularJS在IE下取数据总是缓存问题的解决方法
2016/08/05 Javascript
Angular获取手机验证码实现移动端登录注册功能
2017/05/17 Javascript
vue服务端渲染的实例代码
2017/08/28 Javascript
vue中的watch监听数据变化及watch中各属性的详解
2018/09/11 Javascript
详解搭建es6+devServer简单开发环境
2018/09/25 Javascript
微信小程序页面间值传递的两种方法
2018/11/26 Javascript
解决node-sass偶尔安装失败的方法小结
2018/12/05 Javascript
webpack-mvc 传统多页面组件化开发详解
2019/05/07 Javascript
微信小程序之 catalog 切换实现解析
2019/09/12 Javascript
layui的select联动实现代码
2019/09/28 Javascript
关于vue里页面的缓存详解
2019/11/04 Javascript
vue实现移动端图片上传功能
2019/12/23 Javascript
python监控网卡流量并使用graphite绘图的示例
2014/04/27 Python
python time模块用法实例详解
2014/09/11 Python
用Python实现大文本文件切割的方法
2019/01/12 Python
Jupyter notebook 启动闪退问题的解决
2020/04/13 Python
Django-migrate报错问题解决方案
2020/04/21 Python
Python hashlib模块的使用示例
2020/10/09 Python
企事业单位求职者的自我评价
2013/12/28 职场文书
《最后的姿势》教学反思
2014/02/27 职场文书
卫生厅领导班子党的群众路线教育实践活动整改措施
2014/09/20 职场文书
党的群众路线教育实践活动组织生活会发言材料
2014/10/17 职场文书
倡议书范文大全
2015/04/28 职场文书
我的暑假生活作文(五年级)范文
2019/08/07 职场文书