1.3 保留最后N个元素

Posted Abu11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)
		
if __name__ == \'__main__\':
	with open(r\'test.txt\') as f:
		for line, prevlines in search(f, \'python\', 5):
			for pline in prevlines:
				print(pline, end=\'\')
		print(\'-\' * 20)

总结

deque是一个双向队列,deque(maxlen=N)会新建一个固定大小的队列,当新元素加入并且这个队列已满时,最老的一个元素会被移除。
deque类可以被用在任何你只需要一个简单队列数据结构的场合。如果不设置最大队列的大小,那么就可以得到一个可以存储无限多数据的队列,deque可以在队列的两端执行添加和弹出元素的操作:

q = deque()

q.append(1)
q.append(2)
# deque([1, 2])

q.appendleft(4)
# deque([4, 1, 2])

p = q.pop()
# p = 2, q = deque([4, 1])

p = q.popleft()
# p = 4, q = deque([1])

在队列两端插入或删除元素的时间复杂度都是O(1),而在列表开头插入或删除元素的时间复杂度为O(N)(因为后面的元素都要跟着往后或往前移动)。

以上是关于1.3 保留最后N个元素的主要内容,如果未能解决你的问题,请参考以下文章

python 基础知识点保留最后 N 个元素

JavaScript单行代码,也就是代码片段

从 QPolygonF 获取最后 n 个元素

引用向量的部分片段?

JavaScript笔试题(js高级代码片段)

无法使用 graphene_django 从 GraphQL 获取最后 n 个元素