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中的面向对象编程的概念
Apr 27 Python
基于Python实现一个简单的银行转账操作
Mar 06 Python
pandas将numpy数组写入到csv的实例
Jul 04 Python
python处理DICOM并计算三维模型体积
Feb 26 Python
python实现递归查找某个路径下所有文件中的中文字符
Aug 31 Python
python程序 线程队列queue使用方法解析
Sep 23 Python
python线程定时器Timer实现原理解析
Nov 30 Python
MNIST数据集转化为二维图片的实现示例
Jan 10 Python
python 使用递归回溯完美解决八皇后的问题
Feb 26 Python
Python *args和**kwargs用法实例解析
Mar 02 Python
Python 实现将大图切片成小图,将小图组合成大图的例子
Mar 14 Python
python数据库编程 ODBC方式实现通讯录
Mar 27 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
JAVA/JSP学习系列之二
2006/10/09 PHP
关于php mvc开发模式的感想
2011/06/28 PHP
php遍历文件夹下的所有文件和子文件夹示例
2014/03/20 PHP
php求两个目录的相对路径示例(php获取相对路径)
2014/03/27 PHP
Yii2中hasOne、hasMany及多对多关联查询的用法详解
2017/02/15 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
javascript中的document.open()方法使用介绍
2013/10/09 Javascript
ExtJS4如何给同一个formpanel不同的url
2014/05/02 Javascript
js判断手机号运营商的方法
2015/10/23 Javascript
JavaScript与ActionScript3两者的同性与差异性
2016/09/22 Javascript
package.json文件配置详解
2017/06/15 Javascript
jQuery简单实现向列表动态添加新元素的方法示例
2017/12/25 jQuery
SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法
2018/01/09 Javascript
详解vue-element Tree树形控件填坑路
2019/03/26 Javascript
深入解析vue 源码目录及构建过程分析
2019/04/24 Javascript
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
2020/02/01 Javascript
python缩进区别分析
2014/02/15 Python
采用Psyco实现python执行速度提高到与编译语言一样的水平
2014/10/11 Python
Python中的异常处理学习笔记
2015/01/28 Python
将Python代码嵌入C++程序进行编写的实例
2015/07/31 Python
Python实现的质因式分解算法示例
2018/05/03 Python
python把1变成01的步骤总结
2019/02/27 Python
关于pytorch处理类别不平衡的问题
2019/12/31 Python
Pygame的程序开始示例代码
2020/05/07 Python
TensorFlow低版本代码自动升级为1.0版本
2021/02/20 Python
智利最大的网上商店:Linio智利
2016/11/24 全球购物
口头翻译求职人自荐信
2013/12/07 职场文书
信息技术培训感言
2014/03/06 职场文书
商务日语专业自荐信
2014/04/17 职场文书
毕业设计说明书
2014/05/07 职场文书
群众路线个人对照检查材料
2014/09/23 职场文书
基层党组织整改方案
2014/10/25 职场文书
2014年质检工作总结
2014/11/26 职场文书
2015年八一建军节演讲稿
2015/03/19 职场文书
详解SQL的窗口函数
2022/04/21 Oracle
Android 界面一键变灰 深色主题工具类
2022/04/28 Java/Android