1. 程式人生 > 其它 >1.3 保留最後N個元素

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)(因為後面的元素都要跟著往後或往前移動)。