第一章:数据结构和算法

1.3 保留最后 N 个元素

问题:

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

解决方案:

保留有限历史记录正是 collections.deque 大显身手的时候。比如,下面的代码 cookbook_deque.py 在多行上面做简单的文本匹配,并返回匹配所在行的最后 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_linesprevious_lines.append(line)
# Example use on a file
if __name__ == '__main__':with open(r'/tmp/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)

附上 /tmp/cookbook/somefile.txt 内容:

[root@xucloud-gdy ~]# cat /tmp/cookbook/somefile.txt
aoht awongng python
wwwww
aaaaa
python
cccccc
dddddd
xxxx
ooooo
pppp
weaewae
ppppythonww

运行结果如下:

[root@xucloud-gdy 20190131]# python3 cookbook_deque.py
aoht awongng python
python
--------------------
wwwww
python
--------------------
aaaaa
python
--------------------
dddddd
ppppythonww
--------------------
xxxx
ppppythonww
--------------------
ooooo
ppppythonww
--------------------
pppp
ppppythonww
--------------------
weaewae
ppppythonww
--------------------

使用 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
>>> q
deque([1, 2])

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

转载于:https://www.cnblogs.com/hotskyi/p/10342708.html

python之cookbook-day03相关推荐

  1. Python wmi Cookbook 中文翻译

    简介:   本文所有的例均是假设你在使用来自 http://timgolden.me.uk/python/wmi/cookbook.html 的 WMI 模块.使用此模块,你可以在 Windows 系 ...

  2. python开发学习-day03(set集合、collection系列 、深浅拷贝、函数)

    s12-20160116-day03 pytho自动化开发 day03 Date:2016.01.16 @南非波波 课程大纲: day2 http://www.cnblogs.com/wupeiqi/ ...

  3. Python入门学习——DAY03

    Day03 Python基础 课程目标:掌握Python基础中的必备语法知识 课程概要: 循环语句 字符串格式化 运算符 1. 循环语句 while循环 for循环(后期) while 条件:.... ...

  4. python允许无止境的循环_ParisGabriel:Python无止境 day03

    print("hello world") 变量 : 存储信息的,日后被调用.修改操作 常量: 固定不变的量,字母大写 命名规则: 1. 字母数字下划线组成 2. 不能以数字开头,不 ...

  5. Python基础【day03】:字典(一)

    本节内容 简述 语法 字典的使用 字典内置方法 一.简述 字典是Python中的又一种数据结构,它是通过key-value的数据类型,跟我们小时候用的新华字典差不多,通过key去访问value 二.语 ...

  6. python数据分析学习day03:切片索引和统计函数

    1. 切片索引 1.1 切片和索引 ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样. ndarray 数组可以基于 0 - n 的下标进行索引. ...

  7. Python 变量类型day03

    变量赋值 Python中的变量不需要声明,变量的赋值操作既是变量声明和定义的过程. 每个变量在内存中创建,都包括变量的标识,名称和数据这些信息. 每个变量在使用前都必须赋值,变量赋值以后该变量才会被创 ...

  8. Python第二期-day03

    # i 临时变量, 不用提前声明 # range(start, end, step) # step 步长默认是 1 # [start, end) # for i in range(2, 19, 2): ...

  9. Python学习笔记Day03

    文章目录 数据类型转换 分类 原则:不同的数据之间无法进行运算 自动数据类型转换 运算 判断 强制类型数据转换 强制转换为整型 Int 1.使用`int()` 2.浮点数转换为整数,只保留整数部分 3 ...

  10. 想要学习Python爬虫,看这几本书就够了

    网页抓取就是从网站中提取数据,因为有很多网站,已经有很多开发工具可以用来浏览网站(web爬行)寻找特定的数据片段并自动收集它们(web抓取).收集到的数据大多是非结构化的HTML形式,之后再将其转化为 ...

最新文章

  1. [Sdoi2017]硬币游戏 [高斯消元 KMP]
  2. ceo for one month final around
  3. DCMTK:OFStandard类中的double / ascii转换方法的测试代码
  4. ubuntu16.04安装KDE
  5. Thrift序列化字节数组存取redis VS 对象转Json存取Redis
  6. 7-55 列车调度 (25 分)
  7. 采用Matlab编程实现 高频强调滤波,[转载]MATLAB图像处理-基于高频强调滤波和直方均衡化图像增强...
  8. 一支python教学_第一只python爬虫
  9. 交通灯倒计时c语言程序,交通灯C语言程序,T89S52单片机控制,倒计时,红黄绿灯.doc...
  10. 福利来了,axure8.1注册码
  11. c语言算无限小数,随机算式的除法如果答案是无限循环小数,怎么加精度?
  12. PHP对接银联电子支付接口开发
  13. html生成pdf java_Java实现HTML代码生成PDF文档
  14. 加来道雄 基因编辑 纳米机器人_同样基因编辑技术,为什么2位学者获得诺奖,中国贺建奎被痛骂?!...
  15. 欧几里德算法 扩展欧几里德算法 求解丢番图方程
  16. 2020-08-15
  17. Apple Music 推出空间音频和无损音频
  18. imac15款和17款区别_5K屏2019款iMac轻体验:优缺点都很明显
  19. AI 人工智能 探索 (九)
  20. UI5:创建.yaml文件报错:无法加载文件 C:\Users\86178\AppData\Roaming\npm\ui5.ps1

热门文章

  1. 南邮linux期末考试试题,南邮操作系统试卷及答案.doc
  2. 经验 | 非科班出身怎么转行计算机?
  3. FCN用卷积层代替FC层原因(转)
  4. 自动驾驶使用贝塞尔曲线进行静态障碍物避障测试
  5. vlookup 2张表 显示na_【Excel 函数】Vlookup 正反向查询
  6. 系统无法执行指定的程序。_使用Rust编写操作系统(一):独立式可执行程序
  7. 编写一个脚本判断某个用户是否处在活动模式_使用 TypeScript 编写爬虫
  8. 人脸识别接口_人工智能 人脸识别双目模组摄像头 活体检测的重要作用
  9. 常见数据库默认端口号
  10. java11和13_Java1113