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使用socket远程连接错误处理方法
Apr 29 Python
python非递归全排列实现方法
Apr 10 Python
Python常用时间操作总结【取得当前时间、时间函数、应用等】
May 11 Python
Python实现字符串格式化输出的方法详解
Sep 20 Python
Python pymongo模块用法示例
Mar 31 Python
解决Python pandas plot输出图形中显示中文乱码问题
Dec 12 Python
Python socket实现多对多全双工通信的方法
Feb 13 Python
Python解压 rar、zip、tar文件的方法
Nov 19 Python
Pytorch 使用不同版本的cuda的方法步骤
Apr 02 Python
Python虚拟环境的创建和包下载过程分析
Jun 19 Python
Python字符串的15个基本操作(小结)
Feb 03 Python
Python字节单位转换(将字节转换为K M G T)
Mar 02 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 json_decode函数详细解析
2014/02/17 PHP
ThinkPHP3.1新特性之对页面压缩输出的支持
2014/06/19 PHP
php字符串按照单词进行反转的方法
2015/03/14 PHP
PHP如何实现Unicode和Utf-8编码相互转换
2015/07/29 PHP
举例详解PHP脚本的测试方法
2015/08/05 PHP
PHP串行化与反串行化实例分析
2016/12/27 PHP
PHP学习笔记之session
2018/05/06 PHP
PHP实现15位身份证号转18位的方法分析
2019/10/16 PHP
JavaScript 拾碎[三] 使用className属性
2010/10/16 Javascript
jQuery.getScript加载同域JS的代码
2012/02/13 Javascript
让AJAX不依赖后端接口实现方案
2012/12/03 Javascript
ie8模式下click无反应点击option无反应的解决方法
2014/10/11 Javascript
jQuery中map()方法用法实例
2015/01/06 Javascript
jQuery入门介绍之基础知识
2015/01/13 Javascript
JavaScript判断是否为数组的3种方法及效率比较
2015/04/01 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(二)
2015/12/10 Javascript
jquery仿QQ登录账号选择下拉框效果
2016/03/22 Javascript
Nodejs中解决cluster模块的多进程如何共享数据问题
2016/11/10 NodeJs
JavaScript Date 知识浅析
2017/01/29 Javascript
Vue CLI3 开启gzip压缩文件的方式
2018/09/30 Javascript
webpack4 SplitChunks实现代码分隔详解
2019/05/23 Javascript
Angular 多模块项目构建过程
2020/02/13 Javascript
小程序自定义弹框效果
2020/11/16 Javascript
[01:09]模型精美,特效酷炫!TI9不朽宝藏Ⅰ鉴赏
2019/05/10 DOTA
Python单元测试框架unittest简明使用实例
2015/04/13 Python
老生常谈Python startswith()函数与endswith函数
2017/09/08 Python
英国著名的药妆网站:Escentual
2016/07/29 全球购物
澳大利亚首屈一指的在线购物目的地:Kogan.com
2017/02/02 全球购物
迪拜航空官方网站:flydubai
2017/04/20 全球购物
Lime Crime官网:美国一家主打梦幻精灵系的彩妆品牌
2019/03/22 全球购物
全球性的在线鞋类品牌:Public Desire
2019/04/03 全球购物
迪士尼法国在线商店:shopDisney FR
2020/12/03 全球购物
2014年政工师工作总结
2014/12/18 职场文书
幼师个人总结范文
2015/02/28 职场文书
妇联2016年六一国际儿童节活动总结
2016/04/06 职场文书
解决MySQL报“too many connections“错误
2022/04/19 MySQL