保存最后N个元素
问题:
- 希望在迭代或是其他形式的处理过程中对最后几项记录做一个有限的历史记录统计
解决方案:
- 保存有限的历史记录可算是 colletions.deque 的完美应用场景了。例如:下面的代码对一些列文本行做最简单的文本匹配操作,当发现有匹配时就输出当前的匹配行以及最后检查过的N行文本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/5/2 09:21 # @Author : Evescn # @Site : # @File : 1.3.py # @Software: PyCharm 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) # print(previous_lines) # 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 ) ### somefile.txt test1 test2 test3 test4 test5 python pythonte test6 test7 test8 test9 test10 test11 test12 ### 输出结果: test1 test2 test3 test4 test5 python - - - - - - - - - - - - - - - - - - - - test2 test3 test4 test5 python pythonte - - - - - - - - - - - - - - - - - - - - deque([ 'test8\n' , 'test9\n' , 'test10\n' , 'test11\n' , 'test12' ], maxlen = 5 ) |
讨论:
- 当编写搜索某项记录的代码时,通常会用的含义 yield 关键字的生成器函数。这将处理搜索过程的代码和使用搜索结果的代码成功解耦开来
- deque(maxlen=N) 创建了一个固定长度的队列,当有新纪录加入而队列已满时会自动移除最老的那天记录(先入先出)。例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 | >>> 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),但队列这样解决方案要优雅得多,运行速度也快的多
- 当需要一个简单的队列结构时, deque 可祝你一臂之力,如果不指定队列的大小,就得到了一个无界限的队列,可以在两端执行添加和弹出操作,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | >>> from collections import deque >>> q = deque() >>> q.append( 1 ) >>> q.append( 2 ) >>> q.append( 3 ) >>> q deque([ 1 , 2 , 3 ]) >>> q.appendleft( 4 ) >>> 1 1 >>> q deque([ 4 , 1 , 2 , 3 ]) >>> q.pop() 3 >>> q deque([ 4 , 1 , 2 ]) >>> q.popleft() 4 >>> q deque([ 1 , 2 ]) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程