1.3 保留最后 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(r'../../cookbook/somefile.txt') as f:

for line, prevlines in search(f, 'python', 5):

for pline in prevlines:

print(pline, end='')

print(line, end='')

print('-' * 20)

讨论

我们在写查询元素的代码时,通常会使用包含 yield 表达式的生成器函数,也就是我们上面示例代码中的那样。 这样可以将搜索过程代码和使用搜索结果代码解耦。

使用 deque(maxlen=N) 构造函数会新建一个固定大小的队列。当新的元素加入并且这个队列已满的时候, 最老的元素会自动被移除掉。

代码示例:

>>> 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)

尽管你也可以手动在一个列表上实现这一的操作(比如增加、删除等等)。但是这里的队列方案会更加优雅并且运行得更快些。

更一般的, 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

在队列两端插入或删除元素时间复杂度都是 O(1) ,区别于列表,在列表的开头插入或删除元素的时间复杂度为 O(N) 。

python 数据内容保留最后一位_python3-数据结构和算法 -- 1.3 保留最后 N 个元素相关推荐

  1. python数据的存储结构是指_python数据结构

    一.算法入门 程序设计 = 数据结构 + 算法 算法时为了解决实际问题而设计的,数据结构是算法需要处理的问题载体 数据结构只是静态的描述呢数据元素之间的关系 高效的程序需要再数据结构的基础上设计和选择 ...

  2. python程序结构有哪几种_Python数据结构与算法(几种排序)小结

    Python数据结构与算法(几种排序) 数据结构与算法(Python) 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺 ...

  3. 获取多张表中的数据_趣说:什么是数据结构和算法

    相信你的电脑里面 应该有这么一个 视频教程文件夹 不用我说 在这里面肯定是你 精心收藏的精华教程 不辞辛劳的你 按照每个优秀的老师 都分门别类的安排好 每一系列的精品教程 当你心血来潮之时 亦或是求知 ...

  4. java set第n位_数据结构与算法——常用数据结构及其Java实现

    本文采用Java语言来进行描述,帮大家好好梳理一下数据结构与算法,在工作和面试中用的上.亦即总结常见的的数据结构,以及在Java中相应的实现方法,务求理论与实践一步总结到位. 常用数据结构 数组 数组 ...

  5. python数据内容_炼数成金:Python数据分析内容分享

    相信看这篇文章的每一位朋友,都有过努力学习 炼数成金:Python数据分析     这个课程.提升自我的想法, 可是学习是一件非常反人性的事情,大多数人都是晚上想想千条路,早上醒来走原路.  也相信很 ...

  6. python 判断div 之间的内容是否为空_python实现数据结构与算法之双端队列实现

    简介 双端队列(deque, double-ended queue),是一种具有队列和栈的性质的数据结构.双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行.双端队列可以在队列任意一端 ...

  7. oledbdataadapter 取不到数据 plsql能取到 date_Python3 CookBook | 数据结构和算法(二)...

    欢迎关注我的微信公众号 AlwaysBeta,更多精彩内容等你来. 以下测试代码全部基于 Python3 1.查找最大或最小的 N 个元素 工作中有时会遇到这样的需求,取出数据中前面 10% 的值,或 ...

  8. python列表是顺序表还是链表_Python数据结构与算法(链表使用详解)

    链表 单向链表 p是头节点,指向第一个值,最后一个是伪节点,因为不指向地址. 表元素域elem用来存放具体的数据 链接域next用来存放下一个节点的位置(python中的标识) 变量p指向链表的头节点 ...

  9. python编写代码运用递归画图形_python数据结构与算法 22 递归图形

    上节中我们已经知道有些问题,如果用递归解决变得非常容易.但是仍然很难在大脑里形成一种模型或可视化的方法,让我们直觉地明白函数递归过程到底发生了什么.这一节我们引入几个例子,用递归的方法画几个有趣的图形 ...

最新文章

  1. iOS 9应用开发教程之ios9中实现按钮的响应
  2. 说说 “后台开发” 需要注意哪几点
  3. WPF:仿WIN7窗体打开关闭效果
  4. SpriteKit在复制节点时留了一个巨坑给开发者,需要开发者手动把复制节点的isPaused设置为false...
  5. 谷歌浏览器如何如何禁用弹出窗口阻止程序
  6. td外边加div为啥不隐藏_过年炸油饼注意了,秘制配方比例教给你,柔软不吸油,放凉了不硬...
  7. 谷歌终于推出TensorFlow Lite,实现在移动设备端部署AI
  8. MySQL 5.7安装(多实例)最佳实践
  9. python生成器表达式yield,面向过程编程,部分内置函数
  10. seay代码审计mysql插件报错_Seay源代码审计系统v2.0源码
  11. 运动斗士终南山的不老之道
  12. 在淘宝做前端的这三年 — 第二年
  13. 用计算机打一闪一闪亮晶晶,一闪一闪亮晶晶 我去!RGB轴机械键盘灯光玩法亮瞎人...
  14. 监控安防人员入门基础
  15. 阿里云云数据库(RDS)的登录问题
  16. 服务器被一堆系统登录_饥荒联机云服务器开档
  17. CHINA TOP国家杯:用电子竞技搭建中国文化走出去的平台
  18. Dropbear-轻量级SSH服务器和客户端
  19. mysql超市表格_py mysql结合面向对象,实现类似超市导购机器的功能【1.初始化表数据】...
  20. Bug处理之数据库导入Warning: 1366, Incorrect string value: '\\xD6\\xD0\\xB9\\xFA\\xB1\\xEA...' for column

热门文章

  1. 《GO并发编程实战》—— 条件变量
  2. WebRequestDataBinder实现将请求参数映射为POJO对象
  3. 大型Web 网站 Asp.net Session过期你怎么办
  4. opencv1-安装及资料
  5. 无聊闲做,从使用PHP数组实现约瑟夫环问题谈性能
  6. 【Eclipse】eclipse中设置tomcat启动时候的JVM参数
  7. canvas合成海报所遇问题及解决方案总结
  8. 运用Java对微信公众平台二次开发技术——开发者模式接入
  9. 关于程序员前途的看法和我系列文章的想法
  10. 文件读写'r'和'rb'区别