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 sys.path详细介绍
Oct 17 Python
python实现socket客户端和服务端简单示例
Feb 24 Python
Python多进程通信Queue、Pipe、Value、Array实例
Nov 21 Python
详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别
Jun 23 Python
Python后台开发Django的教程详解(启动)
Apr 08 Python
对python 树状嵌套结构的实现思路详解
Aug 09 Python
django实现用户注册实例讲解
Oct 30 Python
Python语言异常处理测试过程解析
Jan 08 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
Feb 28 Python
如何使用python切换hosts文件
Apr 29 Python
Python+Django+MySQL实现基于Web版的增删改查的示例代码
May 13 Python
python中scrapy处理项目数据的实例分析
Nov 22 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教程之PHP中shell脚本的使用方法分享
2012/02/23 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
jQuery弹性滑动导航菜单实现思路及代码
2013/05/02 Javascript
window.open()实现post传递参数
2015/03/12 Javascript
pace.js页面加载进度条插件
2015/09/29 Javascript
Jquery easyui 实现动态树
2015/11/17 Javascript
基于javascript实现图片切换效果
2016/04/17 Javascript
微信小程序 后台登录(非微信账号)实例详解
2017/03/31 Javascript
AugularJS从入门到实践(必看篇)
2017/07/10 Javascript
javascript代码优化的8点总结
2018/01/29 Javascript
Vue-cli Eslint在vscode里代码自动格式化的方法
2018/02/23 Javascript
webpack css加载和图片加载的方法示例
2018/09/11 Javascript
微信二次分享报错invalid signature问题及解决方法
2019/04/01 Javascript
AngularJS实现的鼠标拖动画矩形框示例【可兼容IE8】
2019/05/17 Javascript
微信小程序实现时间进度条功能
2020/11/17 Javascript
three.js利用卷积法如何实现物体描边效果
2019/11/27 Javascript
typescript编写微信小程序创建项目的方法
2021/01/29 Javascript
[02:12]2019完美世界全国高校联赛(春季赛)报名开启
2019/03/01 DOTA
[54:43]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第一场 2月22日
2021/03/11 DOTA
Python随手笔记第一篇(2)之初识列表和元组
2016/01/23 Python
python使用matplotlib绘制折线图教程
2017/02/08 Python
Python连接SQLServer2000的方法详解
2017/04/19 Python
python+selenium实现登录账户后自动点击的示例
2017/12/22 Python
Python中实现最小二乘法思路及实现代码
2018/01/04 Python
Python实现matplotlib显示中文的方法详解
2018/02/06 Python
python实现图片转字符小工具
2019/04/30 Python
pytorch多GPU并行运算的实现
2019/09/27 Python
python实现PCA降维的示例详解
2020/02/24 Python
“型”走纽约上东区:Sam Edelman
2017/04/02 全球购物
财务经理岗位职责
2013/11/09 职场文书
五月的鲜花活动方案
2014/08/21 职场文书
党性心得体会
2014/09/03 职场文书
群众路线教育实践活动自我剖析思想汇报
2014/10/04 职场文书
2015年驾驶员工作总结
2015/04/29 职场文书
导游词幽默开场白
2019/06/26 职场文书
学长教您写论文:经验总结
2019/07/09 职场文书