python3-cookbook-保留最后 N 个元素

第一章:数据结构和算法

Python 提供了大量的内置数据结构,包括列表,集合以及字典。大多数情况下使用这些数据结构是很简单的。但是,我们也会经常碰到到诸如查询,排序和过滤等等这些普遍存在的问题。 因此,这一章的目的就是讨论这些比较常见的问题和算法。 另外,我们也会给出在集合模块 collections 当中操作这些数据结构的方法。

参考:
https://python3-cookbook.readthedocs.io/zh-cn/latest/index.html
https://github.com/dabeaz/python-cookbook/tree/master

1.3 保留最后 N 个元素

问题

在迭代操作或者其他操作的时候,怎样只保留最后有限几个元素的历史记录

解决方案

保留有限历史记录正是 collections.deque 大显身手的时候。

比如,下面的代码在多行上面做简单的文本匹配,并只返回在前 N 行中匹配成功的行:

from collections import dequedef search(lines, pattern, history=5):previous_lines = deque(maxlen=history)for li in lines:if pattern in li:yield li, previous_linesprevious_lines.append(li)# 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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/645106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鲲鹏微认证——openEuler开源操作系统迁移实践

文章目录 为什么要系统搬迁为什么选择欧拉欧拉系统迁移概述实施路径工具实战 为什么要系统搬迁 2020年12月,CentOs作为由开源社区免费提供的操作系统,宣布将对CentO58于2021年底停止服务,CentO57则于2024年6月底停止服务。 这将直接导致操作…

设计一个停车场

约束和假设 我们应该支持哪种类型的车辆? motorcycle, Car, Bus 每种车型占用的停车位数量是否不同? YesMotorcycle spot -> MotorcycleCompact spot -> Motorcycle, CarLarge spot -> Motorcycle, CarBus can park if we have 5 consecutive …

Linux系统SSH远程管理服务

目录 一、SSH服务介绍 1、SSH协议是什么? 2、SSH的优点 3、SSH的客户端与服务端 4、SSH的原理 4.1 公钥首次连接原理 4.2 ssh加密通讯原理 4.2.1 对称加密 4.2.2 非对称加密 4.2 ssh远程登录 二、服务端配置 1、常见配置项 1.1 修改默认端口 1.2 禁止…

未来已来:AI引领智能时代的多领域巨变

大家好,今天我们将深入探讨人工智能如何彻底改变我们的生活方式,领略未来的无限可能性。 1. 医疗革新:AI担任超级医生 医疗领域是AI最引人注目的战场之一。智能医学影像诊断系统,不仅能够精准识别病变,还能辅助医生提…

VS Code使用Git管理开发项目流程

以VSCode远程连接虚拟机开发为例,已经配置好SSH 在Github上搜索心仪的项目,比如权限管理 点击fork到自己账户仓库 虚拟机下创建一个目录 1)mkdir java_test 2)切换到java_test 初始化并克隆项目 1) git init:初始化仓库 2) g…

node淘宝新镜像地址

最新的配置淘宝镜像的淘宝官方提供的方法 npm config set registry https://registry.npmmirror.com如果你想将npm的下载源恢复为默认的官方源,可以使用以下命令: npm config set registry https://registry.npmjs.org你可以使用以下命令来查看当前npm…

掼蛋功能之识别性格篇

常说:千人千面。大多数人一到牌局的场面,往往精神便会放松,面貌神情不再收敛,一言一行体现出的性格暴露无疑,具体表现为以下几种: 1、浮躁冲动型:此类人多数不讲究团队配合,自顾自出…

UE5 - Polycam扫描文件导入插件

Polycam是利用Gaussian Splatting进行3D重建的3D扫描相关软件,其对应有UE引擎的插件(Plugin_XV3dGS)可以把相关格式的文件导入到引擎; 首先Polycam的官网为:My Captures | Polycam 可以下载各种用户扫描文件&#xff…

vivado I/O和时钟规划设计流程步骤

I/O和时钟规划设计流程步骤 下图显示了左侧的项目设计流程步骤。水平箭头表示项目设计流程中可以执行I/O和时钟规划的点。中的步骤I/O和时钟规划设计流程如右图所示。 项目设计流程从一个空的I/O规划项目、RTL设计项目或合成后网表项目。使用这些项目类型中的任何一种&#xf…

PPO学习

openai用tf实现的真的看不懂,大佬的世界… PPO的详细细节 1. 奖励模型和策略的价值头将 query 和 response 的连接作为输入 奖励模型和策略的价值头 不 仅仅查看响应。相反,它将 query 和 response 连接在一起,作为 query_response def ge…

Python进阶知识:整理6 -> 正则表达式

1 基础匹配用法 # 演示Python中正则表达式re模块的3个基础匹配方法 import re # 1. match()方法 从头匹配 string "hello world" result re.match("hello", string) # 如果头部没有匹配成功就直接失败了,后面就不会继续匹配了 print(result) print(r…

设计模式: 装饰模式

文章目录 一、什么是装饰模式二、装饰模式的结构三、使用场景案例分析 一、什么是装饰模式 在不改变对象原有行为的基础上,动态的来为该对象绑定新的行为。 二、装饰模式的结构 装饰模式结构中主要包含如下角色: Component(抽象部件&…

卸载 MariaDB:

如果你想将 MariaDB 5.5.68 替换为 MySQL 8,请按照以下步骤操作。在执行这些步骤之前,请确保你已经备份了所有重要的数据库和数据,以防发生意外情况。 1. 卸载 MariaDB: 使用适合你系统的包管理器卸载 MariaDB。在 CentOS/RHEL …

橘子学Mybatis08之Mybatis关于一级缓存的使用和适配器设计模式

前面我们说了mybatis的缓存设计体系,这里我们来正式看一下这玩意到底是咋个用法。 首先我们是知道的,Mybatis中存在两级缓存。分别是一级缓存(会话级),和二级缓存(全局级)。 下面我们就来看看这两级缓存。 一、准备工作 1、准备数据库 在此之…

【linux】docker下nextcloud自动挂载硬盘

在使用Nextcloud进行云存储时,我们可能需要将本地硬盘挂载到Nextcloud中,以便进行文件的上传和下载。 在进行硬盘挂载前,我们需要先对要挂载的目录进行权限设置,以便让Nextcloud能够正常读写。我们可以使用chmod 777命令进行权限…

C语言入门到精通之练习十六:最大公约数和最小公倍数

题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 程序分析: (1)最小公倍数输入的两个数之积除于它们的最大公约数,关键是求出最大公约数; (2)求最大公约数用辗…

《如何画好架构图》学习笔记

看了一堂《如何画好架构图》的公开课,结合网上的资料与经验做一些思考总结。文中的例子和图片大多是从课程中摘录的。 1. 4R架构定义 4R架构定义其实是软件架构定义经过归纳提炼后的简称。 软件架构定义:软件架构是指软件系统的顶层(Rank&am…

Linux中并发程序设计

进程的创建和回收 进程概念 概念 程序 存放在磁盘上的指令和数据的有序集合(文件) 静态的 进程 执行一个程序所分配的资源的总称 动态的进程和程序比较 注:进程是存在RAM中,程序是存放在ROM(flash)中的进程内容 BSS段&#xff…

Spring如何使用自定义注解来实现自动管理事务?

人可以做他(她)想做的,但不能要他(她)想要的 一个目录 前言业务代码展示手动挡自动挡事务失效的问题代码地址 前言 在两年半以前,我写了一篇博客:框架的灵魂之注解基础篇: 在那篇博客的结尾,我埋了一个坑&#xff1a…

JAVA 学习 面试(八)集合类

集合类 集合(Collection) 1、 List列表 : 有序 可重复 1、ArrayList : 数组列表 ,内部是通过Array实现,对数据列表进行插入、删除操作时都需要对数组进行拷贝并重排序,因此在知道存储数据量时&#xff0c…