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 06 Python
Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法
May 22 Python
python简单获取数组元素个数的方法
Jul 13 Python
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
May 27 Python
python虚拟环境virtualenv的安装与使用
Sep 21 Python
python pandas库中DataFrame对行和列的操作实例讲解
Jun 09 Python
python3获取当前目录的实现方法
Jul 29 Python
python实现统计代码行数的小工具
Sep 19 Python
python实现在多维数组中挑选符合条件的全部元素
Nov 26 Python
pycharm软件实现设置自动保存操作
Jun 08 Python
python中count函数知识点浅析
Dec 17 Python
python绘制汉诺塔
Mar 01 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分页函数
2006/10/09 PHP
PHP中ADODB类详解
2008/03/25 PHP
PHP 登录记住密码实现思路
2013/05/07 PHP
file_get_contents("php://input", "r")实例介绍
2013/07/01 PHP
Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
2016/03/07 PHP
PHP实现15位身份证号转18位的方法分析
2019/10/16 PHP
国外大牛IE版本检测!现在IE都到9了,IE检测代码
2012/01/04 Javascript
基于jquery的用鼠标画出可移动的div
2012/09/06 Javascript
JavaScript动态操作表格实例(添加,删除行,列及单元格)
2013/11/25 Javascript
JS控制静态页面之间传递参数获取参数并应用的简单实例
2016/08/10 Javascript
详解Angular.js指令中scope类型的几种特殊情况
2017/02/21 Javascript
基于JavaScript实现的顺序查找算法示例
2017/04/14 Javascript
微信通过页面(H5)直接打开本地app的解决方法
2017/09/09 Javascript
phantomjs导出html到pdf的方法总结
2017/10/19 Javascript
JavaScript实现精美个性导航栏筋斗云效果
2017/10/29 Javascript
vue.js 图片上传并预览及图片更换功能的实现代码
2018/08/27 Javascript
详解react native页面间传递数据的几种方式
2018/11/07 Javascript
ES6 Generator函数的应用实例分析
2019/06/26 Javascript
Vue编写可显示周和月模式的日历 Vue自定义日历内容的显示
2019/06/26 Javascript
Django中redis的使用方法(包括安装、配置、启动)
2018/02/21 Python
python实现手机通讯录搜索功能
2018/02/22 Python
基于pip install django失败时的解决方法
2018/06/12 Python
Python Django给admin添加Action的方法实例详解
2019/04/29 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
2019/06/25 Python
多视角3D可旋转的HTML5 Logo动画
2016/03/02 HTML / CSS
详解HTML5中rel属性的prefetch预加载功能使用
2016/05/06 HTML / CSS
英国排名第一的餐具品牌:Denby Pottery
2019/11/01 全球购物
介绍一下linux的文件系统
2012/03/20 面试题
一岗双责责任书
2014/04/15 职场文书
优秀的个人求职信范文
2014/05/09 职场文书
厉行勤俭节约倡议书
2014/05/16 职场文书
三八红旗集体先进事迹材料
2014/05/22 职场文书
小学感恩节活动总结
2015/03/24 职场文书
2015年食品安全宣传周活动总结
2015/07/09 职场文书
学生病假条怎么写
2015/08/17 职场文书
解决numpy和torch数据类型转化的问题
2021/05/23 Python