003 保存最后N个元素

collections.deque可以完美的解决这个问题

explanation:deque 可以创建一个固定长度的队列。有新的数据插入且队列已经满时,自动删除最老的一条数据。

基础用法如下

# 用法
# 声明一个长度等于3的队列
# deque也可以不声明长度 
q = deque()
q = deque(maxlen=3)
# 在队列中后面追加数据
q.append('a')
q.append('b')
q.append('c')
q.append('d')
print(f'01:{q}')
# 在队列前面添加数据
q.appendleft(-1)
print(f'02:{q}')
# 删除队列末尾的数据,返回值为被删除的数据
pop_res = q.pop()
print(f'pop_res: {pop_res}')
print(f'03:{q}')
# 删除队列前面的数据,返回值为被删除的数据
popleft_res = q.popleft()
print(f'popleft_res: {popleft_res}')
print(f'04:{q}')
# 从队列两端添加或者弹出的时间复杂度都是O(1),

<OUTPUT>
01:deque(['b', 'c', 'd'], maxlen=3)
02:deque([-1, 'b', 'c'], maxlen=3)
pop_res: c
03:deque([-1, 'b'], maxlen=3)
popleft_res: -1
04:deque(['b'], maxlen=3)

举例说明

从列表内查找某个数据,保留最新的5条

PS:yield的用法后面单独写一篇

def search(lines, data, history=5):    
			previous_lst = deque(maxlen=history)    
			for line in lines:        
					if data in line:            
							yield line, previous_lst            
							previous_lst.append(line)

lst = ['z1', 'z2', 'z3', 'z4', 'z5', 'x1', 'z6', 'x2']    
for l in search(lst, 'z'):        
		print(l)

<OUTPUT>
('z1', deque([], maxlen=5))
('z2', deque(['z1'], maxlen=5))
('z3', deque(['z1', 'z2'], maxlen=5))
('z4', deque(['z1', 'z2', 'z3'], maxlen=5))
('z5', deque(['z1', 'z2', 'z3', 'z4'], maxlen=5))
('z6', deque(['z1', 'z2', 'z3', 'z4', 'z5'], maxlen=5))

源码地址

https://github.com/a0bb/python_gogo/blob/master/python_cookbook/0003.py
003 保存最后N个元素

上一篇:概率图:高斯混合模型(GMM)


下一篇:C++小例子——01 向量类myVector