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的接口测试框架实例
Nov 04 Python
Python存取XML的常见方法实例分析
Mar 21 Python
pandas把dataframe转成Series,改变列中值的类型方法
Apr 10 Python
浅谈python中str字符串和unicode对象字符串的拼接问题
Dec 04 Python
将python图片转为二进制文本的实例
Jan 24 Python
Python的条件表达式和lambda表达式实例
Jan 31 Python
钉钉群自定义机器人消息Python封装的实例
Feb 20 Python
详解Python sys.argv使用方法
May 10 Python
django 中的聚合函数,分组函数,F 查询,Q查询
Jul 25 Python
Python中变量的输入输出实例代码详解
Jul 28 Python
基于Pytorch SSD模型分析
Feb 18 Python
Python实现手绘图效果实例分享
Jul 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中面向对象三大特性之一[封装性]的应用
2011/06/13 PHP
win10环境PHP 7 安装配置【教程】
2016/05/09 PHP
超强多功能php绿色集成环境详解
2017/01/25 PHP
PHP实现的解汉诺塔问题算法示例
2018/08/06 PHP
javascript 数组学习资料收集
2010/04/11 Javascript
javascript getElementsByTagName
2011/01/31 Javascript
NodeJS 模块开发及发布详解分享
2012/03/07 NodeJs
js时间戳转为日期格式的方法
2015/12/28 Javascript
javascript html5 canvas实现可拖动省份的中国地图
2016/03/11 Javascript
用jquery的attr方法实现图片切换效果
2017/02/05 Javascript
Vue底层实现原理总结
2018/02/17 Javascript
解决Vue.js 2.0 有时双向绑定img src属性失败的问题
2018/03/14 Javascript
浅谈Redux中间件的实践
2018/07/27 Javascript
Vue中对拿到的数据进行A-Z排序的实例
2018/09/25 Javascript
详解vue中多个有顺序要求的异步操作处理
2019/10/29 Javascript
vue计算属性+vue中class与style绑定(推荐)
2020/03/30 Javascript
[46:38]完美世界DOTA2联赛PWL S2 Magma vs PXG 第三场 11.28
2020/12/02 DOTA
Python实现屏幕截图的两种方式
2018/02/05 Python
python单例模式的多种实现方法
2019/07/26 Python
pytorch 共享参数的示例
2019/08/17 Python
Python解析json代码实例解析
2019/11/25 Python
python+playwright微软自动化工具的使用
2021/02/02 Python
墨西哥巴士车票在线购买:ClickBus
2018/03/27 全球购物
C#面试常见问题
2013/02/25 面试题
保荐人的岗位职责
2013/11/19 职场文书
信息科学与技术专业求职信范文
2014/02/20 职场文书
《囚绿记》教学反思
2014/03/01 职场文书
副总经理岗位职责
2014/03/16 职场文书
会计专业毕业生自荐书
2014/06/25 职场文书
2014领导班子四风问题对照检查材料思想汇报
2014/09/21 职场文书
2014银行领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
上诉状格式
2015/05/23 职场文书
推销搭讪开场白
2015/05/28 职场文书
入团申请书格式
2019/06/20 职场文书
教你利用python实现企业微信发送消息
2021/05/23 Python
JS前端使用canvas实现物体的点选示例
2022/08/05 Javascript